C++ 如何将两个map<int,vector<char>>对应值插入map<vector<char>,vector<char>>
原代码存在的核心逻辑问题
- 类型错配:需求是构建*键为vector
、值为vector *的映射结构,代码却定义了键值均为char类型的 map<char, char>* mapCharacters,完全不符合目标的类型要求 - 键值对应颠倒:插入操作时把
encodedx的second(即x、y、z)作为新map的键、phrasex的second(即a、b、c)作为新map的值,和需求要求的“将x的second作为新map的键、y的second作为新map的值”的规则完全相反 - 冗余无意义循环:代码中获取了
it1->second的迭代器t1但从未实际使用,空转的内层循环会反复插入完全相同的键值对,触发map的重复插入校验,没有任何实际作用 - 缺少边界防护:直接并行推进两个map的迭代器时,没有判断迭代器是否越过各自的终点边界,一旦两个源map的元素数量不一致,就会触发内存越界访问
正确实现方案
先明确基础逻辑:需要将两个源map中相同int键对应的vector
并行迭代遍历
适用于两个源map元素数量完全一致、且迭代顺序和对应关系完全匹配的场景,实现简洁高效:
// 源map定义(对应题目中的x、y) map<int, vector<char>> x = {{1, {'a'}}, {2, {'b'}}, {3, {'c'}}}; map<int, vector<char>> y = {{1, {'x'}}, {2, {'y'}}, {3, {'z'}}}; // 目标map定义:匹配要求的vector键、vector值结构 map<vector<char>, vector<char>> newMap; auto it_x = x.begin(); auto it_y = y.begin(); // 增加边界判断,避免越界 while (it_x != x.end() && it_y != y.end()) { newMap.insert({it_x->second, it_y->second}); ++it_x; ++it_y; }
按键匹配(鲁棒性更强)
不依赖迭代器顺序,只要两个源map存在相同的int键,就能自动匹配对应关系,就算map内部元素顺序有差异、元素数量不一致也不会出错:
map<vector<char>, vector<char>> newMap; for (const auto& pair_x : x) { // 用x侧的int键去y侧查找对应元素 auto it_y = y.find(pair_x.first); if (it_y != y.end()) { newMap.insert({pair_x.second, it_y->second}); } }
两种方式最终生成的newMap内容完全符合要求:{a, x}, {b, y}, {c, z}。
提示:如果按照原有代码的逻辑用指针管理map对象,只需要将上述代码中直接操作对象的部分替换为指针访问即可,比如把
x.begin()改为phrasex->begin(),注意保持插入时的键值顺序不要颠倒。
内容的提问来源于stack exchange,提问作者Steven Truong
相关产品推荐
相关产品推荐

