C++ STL多重映射删除/擦除值

C++ STL多重映射删除/擦除值,c++,stl,C++,Stl,我有STL Multimap,我想从映射中删除具有特定值的条目,我不想删除整个键,因为该键可能映射到所需的其他值 请提供任何帮助。如果我理解正确,这些值可以显示在任何键下。如果是这种情况,您必须在多重映射上迭代并删除特定值 typedef std::multimap<std::string, int> Multimap; Multimap data; for (Multimap::iterator iter = data.begin(); iter != data.end();)

我有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);
}
typedef std::multimap multimap;
多地图数据;
for(Multimap::iterator iter=data.begin();iter!=data.end();)
{
//您必须这样做,因为迭代器是无效的
多重映射::迭代器擦除_iter=iter++;
//删除所有偶数值
如果(擦除\u iter->second%2==0)
数据擦除(擦除);
}
自C++11以来,在最后删除的元素后面返回一个迭代器

因此,您可以更清晰地重写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;
}
typedef std::multimap multimap;
多地图数据;
for(Multimap::iterator iter=data.begin();iter!=data.end();)
{
//删除所有偶数值
如果(iter->second%2==0)
iter=数据擦除(iter);
其他的
++iter;
}

(另请参见答案)

谢谢这对我有用,我一直在寻找使用remove_if算法。我担心
remove_if
from
只适用于可以重新分配值的容器(vector、deque、list-除了上次的次优值)执行
*it1=*it2
。这对于map是不可能的,因为它可能会破坏顺序。@nietaki:不,代码按照注释所说的做。它将从值为偶数的贴图中删除所有元素。现在取消你的否决票:)@nietaki为什么要这样做?它是否完全等同于您的示例,只是引入了一个额外的临时变量?除了尼古拉的要求,删除你过时的答案也是合适的令人困惑。一个可能的解决方案可能是交换键和值,这可能不是所有阅读此语句的人都可以选择的选项,但可能是某些人的选项。这是否回答了您的问题?