如何添加到已经存储在集合中的集合中?

时间:2019-03-30 05:53:49

标签: c++ c++11 unordered-map

我有以下内容:

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);
}

有更好的方法吗?

2 个答案:

答案 0 :(得分:2)

如果尝试访问不存在的键,operator[]会自动默认构造并插入一个值,因此您可以将代码简化为:

void SpritesheetManager::addFileToFileListForSheet(std::string sheetprefix,std::string filename) {
    _loadedFiles[sheetprefix].insert(filename);
}

答案 1 :(得分:1)

如果您保留此数据结构,Etienne de Martel的答案将简化代码。 但是,如果您不需要工作表前缀所共有的任何功能(例如遍历具有相同前缀的所有文件等),而只关心保留具有相同前缀的多个文件,则可以通过以下方式大大简化代码:使用unordered_multimap

标题:

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));
}