【问题标题】:STL Multimap Remove/Erase ValuesSTL Multimap 删除/擦除值
【发布时间】:2010-01-22 07:10:07
【问题描述】:

我有 STL Multimap,我想从映射中删除具有特定值的条目,我不想删除整个键,因为该键可能映射到其他所需的值。

请帮忙。

【问题讨论】:

标签: c++ stl


【解决方案1】:

如果我理解正确,这些值可以出现在任何键下。如果是这种情况,您将不得不遍历您的多图并删除特定值。

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);
}

【讨论】:

  • 谢谢这对我有用,我正在寻找使用 remove_if 算法。
  • 恐怕来自&lt;algorithm&gt;remove_if 仅适用于可以重新分配值(向量、双端队列、列表- 除了最后一个次优)的容器,执行*it1 = *it2。这对于地图是不可能的,因为它可能会破坏排序。
  • @nietaki:不,代码执行 cmets 所说的。它从地图中删除值为偶数的所有元素。现在删除你的反对票:)
  • @nietaki 为什么要这样?它不完全等同于您的示例仅引入一个额外的临时变量吗?除了 Nikola 的要求,删除你过时的答案也是合适的。
  • 我认为将Multimap::iterator erase_iter = iter++; 放在一个语句中会令人困惑。
【解决方案2】:

自 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的回复)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-17
    • 2011-10-24
    • 1970-01-01
    • 2010-09-08
    • 1970-01-01
    • 2011-04-21
    • 2014-12-21
    • 1970-01-01
    相关资源
    最近更新 更多