【发布时间】:2020-02-25 15:19:11
【问题描述】:
我有一个带有重复项(重复键)的多图,我想从中删除所有重复项,除了最近添加到多图的那个。
假设我有
multimap<int, int> multi;
multi.insert(pair<int, int>(1, 1));
multi.insert(pair<int, int>(1, 12));
multi.insert(pair<int, int>(2, 500));
multi.insert(pair<int, int>(2, 789));
multi.insert(pair<int, int>(1, 888));
我已经遍历了这张地图,它看起来像这样:
1 : 1
1 : 12
1 : 888
2 : 500
2 : 789
现在我希望删除重复的 1 : 1 和 1 : 12,因为最后添加的一对是 1 : 888。同时删除 2 : 500,因为 2 : 789 最近被添加到地图中。
但是我该怎么做呢?我试图将这个多图的每个元素放入法线贴图中,因为它会自行删除重复项。问题是它不会保留最近添加的副本:c
【问题讨论】:
-
你为什么不使用
std::map,然后用operator[]添加值? -
你看过
equal_range吗?它将返回具有相同键的元素范围。然后,您应该删除除最后一个之外的所有内容。 -
我敢打赌,如果使用插入,将多图复制到地图中将保留每个元素的第一个。但我不确定这是否得到保证。但如果是这种情况,使用反向迭代器进行复制可能只会保留最新的元素。编辑:在重复键的情况下,未指定使用哪个元素。有一个建议可以解决这个问题:cplusplus.github.io/LWG/issue2844
-
您是想获得一个只有唯一键的新容器,还是想将
multi就地转换为拥有唯一键? -
@eyesima 听起来你并不需要复制。如果我理解正确,在插入之前,您可以先
find查看该键是否已存在,更新任何现有元素然后替换它。然后你可以使用map而不必担心重复。
标签: c++ algorithm dictionary c++11 data-structures