关于正确高效填充std::map<std::string, std::vector<std::string>>的技术问询
问题解答
1. 当前方式是否正确高效?
- 正确性:写法是正确的,不会触发语法或运行时错误。
- 效率:并不高效。步骤1里
myMap[strCondition];会默认构造一个空的std::vector<std::string>插入map,如果后续步骤2的anotherCondition不成立,这个空vector属于无意义的冗余构造,浪费了内存和构造开销。
2. 步骤1和步骤2之间访问map键值对是否会因vector未初始化导致崩溃?
不会崩溃。步骤1执行后,map中已存在strCondition对应的键值对,关联的vector是默认构造完成的空vector(完全初始化状态),访问它的成员方法(如size()、begin())或进行读写操作都安全。
即使没有步骤1,中间代码若用myMap[strCondition]访问键,std::map的operator[]也会自动插入一个默认构造的空vector,同样不会出现未初始化情况;只有用find()查找后直接解引用end()迭代器,才会触发未定义行为,但你的场景不存在这种情况。
3. 是否可以省略步骤1?
完全可以省略步骤1,且推荐这么做。
步骤2中的myMap[strCondition]会自动处理键不存在的情况:当strCondition不在map中时,operator[]会默认构造一个空vector并插入map,返回该vector的引用后,后续的insert操作能正常执行。
省略步骤1还能避免冗余的vector构造——比如condition成立但anotherCondition不成立时,步骤1会在map中留下无用的空键值对,省略后就不会出现这种问题。
额外优化建议
如果希望anotherCondition不成立时,map中不会出现strCondition这个空键,可以改用find()+emplace()组合进一步提升效率:
// Step2优化版 std::vector<std::string> tokens; // 填充tokens if(anotherCondition) { auto it = myMap.find(strCondition); if(it != myMap.end()) { // 键已存在,直接向已有vector插入元素 it->second.insert(it->second.end(), tokens.begin(), tokens.end()); } else { // 键不存在,直接构造vector并插入map,避免默认构造+插入的两步操作 myMap.emplace(strCondition, std::move(tokens)); // 用std::move减少拷贝 } }
内容的提问来源于stack exchange,提问作者arjun gulyani
相关产品推荐
相关产品推荐

