【发布时间】:2010-01-22 07:10:07
【问题描述】:
我有 STL Multimap,我想从映射中删除具有特定值的条目,我不想删除整个键,因为该键可能映射到其他所需的值。
请帮忙。
【问题讨论】:
-
一个可能的解决方法是交换键和值,这可能不是所有阅读本文的人的选择,但可能适用于某些人。
我有 STL Multimap,我想从映射中删除具有特定值的条目,我不想删除整个键,因为该键可能映射到其他所需的值。
请帮忙。
【问题讨论】:
如果我理解正确,这些值可以出现在任何键下。如果是这种情况,您将不得不遍历您的多图并删除特定值。
typedef std::multimap<std::string, int> Multimap;
Multimap data;
for (Multimap::iterator iter = data.begin(); iter != data.end();)
{
// you have to do this because iterators are invalidated
Multimap::iterator erase_iter = iter++;
// removes all even values
if (erase_iter->second % 2 == 0)
data.erase(erase_iter);
}
【讨论】:
<algorithm> 的remove_if 仅适用于可以重新分配值(向量、双端队列、列表- 除了最后一个次优)的容器,执行*it1 = *it2。这对于地图是不可能的,因为它可能会破坏排序。
Multimap::iterator erase_iter = iter++; 放在一个语句中会令人困惑。
自 C++11 起,std::multimap::erase 在最后一个移除的元素之后返回一个迭代器。
所以你可以更干净地重写 Nikola 的答案,而不需要引入本地的 erase_iter 变量:
typedef std::multimap<std::string, int> Multimap;
Multimap data;
for (Multimap::iterator iter = data.begin(); iter != data.end();)
{
// removes all even values
if (iter->second % 2 == 0)
iter = data.erase(iter);
else
++iter;
}
(另见this question的回复)
【讨论】: