如何向嵌套集合中添加元素?求C++现有代码优化方案
解答你的两个技术问题
1. 如何向已存储在集合中的集合添加元素?
对于这种嵌套容器(比如你用的std::unordered_map<std::string, std::unordered_set<std::string>>),核心逻辑很清晰:
- 先确保外层容器里存在目标键对应的内层集合:如果键不存在,就自动创建一个空的内层集合;如果已经存在,直接复用现有集合。
- 直接向内层集合插入目标元素即可。
在C++里,外层容器的下标运算符[]可以帮你一步搞定第一步——当你用_loadedFiles[sheetprefix]访问时,要是sheetprefix这个键还没在map里,std::unordered_map会自动为你生成一个默认构造的空std::unordered_set<std::string>,之后直接调用内层集合的insert方法就能添加元素了。
2. 现有C++代码的优化实现
你的现有代码确实有可以简化和提效的空间,我们来具体说:
原代码的冗余点
原代码里先通过find判断键是否存在,再创建空的临时std::unordered_set赋值给键,这两步完全是多余的:
std::unordered_map的[]运算符本身就会在键不存在时自动生成默认构造的内层集合,根本不用手动判断和创建空集合。- 临时创建的空
values没有任何意义,因为默认构造的std::unordered_set本来就是空的。
最简优化版本
只需要一行核心代码就能实现需求,代码更简洁,效率也更高:
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){ // 直接通过[]访问,不存在则自动创建空集合,随后插入元素 _loadedFiles[sheetprefix].insert(filename); }
进阶优化(C++17及以上)
如果你想更明确地控制集合的创建逻辑,避免[]运算符可能带来的隐式构造,可以使用try_emplace方法——它会在键不存在时原地构造内层集合,完全避免不必要的拷贝操作:
void SpritesheetManager::addFileToFileListForSheet(std::string sheetprefix, std::string filename){ // try_emplace返回pair:指向目标元素的迭代器 + 是否新创建元素的布尔值 auto [it, inserted] = _loadedFiles.try_emplace(sheetprefix); // 向内层集合插入目标文件 it->second.insert(filename); }
这两种优化方式都比原代码更简洁高效,同时逻辑也更清晰。
内容的提问来源于stack exchange,提问作者Rahul Iyer
相关产品推荐
相关产品推荐

