C++中如何将循环生成、清空复用的list存入std::map对应不同键
C++ std::list存入std::map实现方案
现有代码问题排查
你当前的代码存在两处核心问题,调整后即可实现每个唯一键对应独立可访问的std::list的需求:
- 语法错误:for循环的变量定义缺失标识符
i,应写为for(int i = 0; i < 6; i++) - 逻辑错误:所有插入操作使用了相同的键
"Key",而std::map的键具有唯一性,后续重复插入相同键的操作会直接失效,最终map中只会保留1条数据
实现原理
你现有的存储逻辑本身是成立的:调用insert时传入的myList会做值拷贝,后续调用myList.clear()不会影响已经存入map中的list副本,不需要担心清空操作会污染已存储的数据。
修正后完整代码
#include <string> #include <list> #include <map> int main(){ std::map<std::string, std::list<std::string>> myMap; std::list<std::string> myList; int j = 0; while(j<4){ // 可自定义每次循环生成的list内容,此处为示例 for(int i = 0; i < 6; i++){ myList.push_back("value_" + std::to_string(j) + "_" + std::to_string(i)); } // 生成唯一键,避免重复插入失败 std::string curKey = "Key_" + std::to_string(j); myMap.insert(std::pair<std::string, std::list<std::string>>(curKey, myList)); myList.clear(); j++; } // 后续可直接通过键访问对应list // 示例:读取Key_2对应list的第一个元素 // std::string firstVal = myMap["Key_2"].front(); return 0; }
性能优化建议
如果不需要保留myList插入后的原始内容,可以使用移动语义避免list的拷贝开销,插入代码修改为:
myMap.insert({curKey, std::move(myList)});
移动后原myList处于有效但未定义的状态,你后续会调用clear()重置,完全不影响业务逻辑。
内容的提问来源于stack exchange,提问作者Connor Ronnoc
相关产品推荐
相关产品推荐

