【问题标题】:std::multimap and equal_rangestd::multimap 和 equal_range
【发布时间】:2013-02-27 09:52:36
【问题描述】:

我对@9​​87654324@ 容器有些头疼,我想知道实现目标的正确方法是什么。基本上,这是我的SSCCE

#include <iostream>
#include <map>

int main ()
{
    typedef std::multimap<int, int> CollectionType;
    typedef std::pair<CollectionType::iterator, CollectionType::iterator> RangeType;

    CollectionType multiMap;

    multiMap.insert(std::make_pair(1, 1));
    multiMap.insert(std::make_pair(1, 2));
    multiMap.insert(std::make_pair(2, 3));
    multiMap.insert(std::make_pair(2, 4));
    multiMap.insert(std::make_pair(2, 5));
    multiMap.insert(std::make_pair(3, 1));

    RangeType range = multiMap.equal_range(2);
    for (CollectionType::iterator iterator = range.first; iterator != range.second; ++iterator)
    {
        if (iterator->second == 4)
        {
            //multiMap.erase(iterator);//ISSUE 1
        }
        else
        {
            //iterator->first = -1;//ISSUE 2
        }
    }

    return 0;
}

正如您在上面看到的,我需要为给定键选择multimap 的范围,然后:

  1. 我需要从范围中删除某些行
  2. 我需要更改范围内其他行的键

关于 1,既然“references and iterators to the erased elements are invalidated”,我该如何删除这些元素?我应该在某个容器中推送特定的迭代器并在循环结束后对其进行迭代吗?我看到了this answer,但它似乎有点hackish/丑陋/容易出错/等等......

关于 2,由于“愚蠢”方法(显然)不起作用,什么是实现我需要的好方法?一旦我解决了问题 1,我可以删除元素并在它们的位置插入新元素,但是如果假设我错误地插入了一个与我刚刚删除的键相同的项目,那可能不会弄乱迭代吗? ..

int second = iterator->second;
localEdges.smarter_erase(iterator);
localEdges.insert(std::make_pair(-1, second));

【问题讨论】:

    标签: c++ iterator range multimap erase


    【解决方案1】:

    erase 返回一个迭代器,因此请将您的迭代器重置为该迭代器,它将继续有效。

    只需用新密钥重新插入,删除原来的密钥

    http://ideone.com/0Pr6Qc:

    #include <iostream>
    #include <map>
    
    void printMultimap(const std::multimap<int, int>& multiMap)
    {
        std::cout << "MultiMap:\n";
        for (const auto& pair : multiMap)
        {
            std::cout << pair.first << ":" << pair.second << "\n";
        }
    }
    
    int main()
    {
        std::multimap<int, int> multiMap;
        multiMap.insert(std::make_pair(1, 1));
        multiMap.insert(std::make_pair(1, 2));
        multiMap.insert(std::make_pair(2, 3));
        multiMap.insert(std::make_pair(2, 4));
        multiMap.insert(std::make_pair(2, 5));
        multiMap.insert(std::make_pair(3, 1));
    
        printMultimap(multiMap);
    
        auto range = multiMap.equal_range(2);
        for (auto iterator = range.first; iterator != range.second;)
        {
            if (iterator->second != 4)
            {
                multiMap.insert(std::make_pair(-1, iterator->second));
            }
            iterator = multiMap.erase(iterator);
        }
    
        printMultimap(multiMap);
    
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-19
      • 2011-02-08
      • 2011-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多