c++ - 在键上,保留第一个贴图的值 c++11 C++ 相交两个贴图

  显示原文与译文双语对照的内容
136 3

我遇到了 C++ 和地图和交集的问题。

有 3个映射,前两个是 map<int, double>,最后一个是 map<int, CustomType>我想从第 2个映射中删除地图键的所有实例,这不作为 3rd 地图中的键。简而言之,我有第三个映射,包含对象列表和包含对象的一些数据的前两个映射。在某些时候清理具有对象的地图并删除某些项目,现在需要分别清除它的他两个映射。

我已经尝试了以下操作:

map<int, double> map1, map2;
map<int, CustomType> map3;
for (auto it = map1.cbegin(); it!= map1.cend(); )
{
 if ( map3.find(it->first) == map3.end() )
 {
 map2.erase(it);
 map1.erase(it++);
 }
 else ++it;
}

这给了我 map1.erase 行上的错误"未分配释放指针"。我已经经查看了 set_intersection,但是我不相信它会在这种情况下工作,因为值将不同。

感谢你的帮助。

时间:原作者:0个回答

136 2

你需要独立迭代 map1map2不能使用 map1的迭代器操作另一个映射( 。erasemap2 或者在 map2 中执行任何其他操作) 。
因此,代码应该类似于下面这样:

map<int, double> map1, map2;
map<int, CustomType> map3;
for (auto it = map1.cbegin(); it!= map1.cend(); )
{
 if ( map3.find(it->first) == map3.end() )
 it = map1.erase(it);
 else
 ++it;
}
for (auto it = map2.cbegin(); it!= map2.cend(); )
{
 if ( map3.find(it->first) == map3.end() )
 it = map2.erase(it);
 else
 ++it;
}
原作者:
72 0

你正在尝试从map2中删除一个元素,该元素来自map1的一个迭代器。这将不起作用。你需要从迭代器获取 key-value 并使用它从map2中删除。当你为map1调用erase时,你会使迭代器失效,因为你删除了它指向的元素。递增迭代器,然后使用 key-value 调用 map1.erase() 。

原作者:
118 0

你接近了解决方案,但是问题是迭代器基本上是一个指针。
因此,你可以使用"它"在map1和map2上同时。

void removeUnexist(const map<int, double>& m, const map<int, CustomType>::iterator& it) {
 i = m.find(it->first);
 if(i == m.end()) {
 m.erase(i);
 }
}
map<int, double> map1, map2;
map<int, CustomType> map3;
for (auto it = map3.cbegin(); it!= map3.cend(); it++) {
 removeUnexist(map1, it);
 removeUnexist(map2, it);
}
原作者:
...