如何添加到已存储在集合中的集合?
How to add to a collection which is already stored in a collection?
我有以下内容:
class SpritesheetManager{
std::unordered_map<std::string,std::unordered_set<std::string>> _loadedFiles;
void addFileToFileListForSheet(std::string sheetprefix,std::string filename);
}
添加文件时我这样做:
void SpritesheetManager::addFileToFileListForSheet(std::string sheetprefix,std::string filename){
bool containsKey = (_loadedFiles.find(sheetprefix)!= _loadedFiles.end());
std::unordered_set<std::string> values;
if(!containsKey){
_loadedFiles[sheetprefix] = values;
}
_loadedFiles[sheetprefix].insert(filename);
}
有更好的方法吗?
如果您尝试访问不存在的键,利用 operator[]
自动默认构造和插入值这一事实,您可以将代码简化为:
void SpritesheetManager::addFileToFileListForSheet(std::string sheetprefix,std::string filename) {
_loadedFiles[sheetprefix].insert(filename);
}
如果您保留此 data-structure,Etienne de Martel 的回答将简化代码。
但是,如果您不需要 sheet 前缀共有的任何功能(例如遍历具有相同前缀的所有文件等),并且只关心保留具有相同前缀的多个文件,您可以简化你的代码通过使用 unordered_multimap
:
Header:
class SpritesheetManager {
std::unordered_multimap<std::string, std::string> _loadedFiles;
void addFileToFileListForSheet(std::string sheetprefix, std::string filename);
}
实施:
void SpritesheetManager::addFileToFileListForSheet
(std::string sheetprefix, std::string filename) {
_loadedFiles.insert(std::make_par(sheetprefix, filename));
}
我有以下内容:
class SpritesheetManager{
std::unordered_map<std::string,std::unordered_set<std::string>> _loadedFiles;
void addFileToFileListForSheet(std::string sheetprefix,std::string filename);
}
添加文件时我这样做:
void SpritesheetManager::addFileToFileListForSheet(std::string sheetprefix,std::string filename){
bool containsKey = (_loadedFiles.find(sheetprefix)!= _loadedFiles.end());
std::unordered_set<std::string> values;
if(!containsKey){
_loadedFiles[sheetprefix] = values;
}
_loadedFiles[sheetprefix].insert(filename);
}
有更好的方法吗?
如果您尝试访问不存在的键,利用 operator[]
自动默认构造和插入值这一事实,您可以将代码简化为:
void SpritesheetManager::addFileToFileListForSheet(std::string sheetprefix,std::string filename) {
_loadedFiles[sheetprefix].insert(filename);
}
如果您保留此 data-structure,Etienne de Martel 的回答将简化代码。
但是,如果您不需要 sheet 前缀共有的任何功能(例如遍历具有相同前缀的所有文件等),并且只关心保留具有相同前缀的多个文件,您可以简化你的代码通过使用 unordered_multimap
:
Header:
class SpritesheetManager {
std::unordered_multimap<std::string, std::string> _loadedFiles;
void addFileToFileListForSheet(std::string sheetprefix, std::string filename);
}
实施:
void SpritesheetManager::addFileToFileListForSheet
(std::string sheetprefix, std::string filename) {
_loadedFiles.insert(std::make_par(sheetprefix, filename));
}