std::multimap and equal_range

3

我在使用std::multimap容器时遇到了一些困难,希望知道实现我的目标的正确方法。基本上,以下是我的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. 我需要更改范围中其他行的键
关于第一点,由于"擦除元素的引用和迭代器将失效",那么如何删除这些元素呢?我应该在某个容器中存储特定的迭代器,并在循环结束后对其进行迭代吗?我看到了这个答案,但它似乎有些hackish /难看 /容易出错/等等...
关于第二点,由于"笨拙"的方法不会(显然)奏效,那么实现我需要的东西的好方法是什么?一旦解决问题1,我可以删除元素并插入新元素替代它们,但如果我错误地插入了一个与刚才删除的相同键的项目,那么这样做是否会弄乱迭代?...
int second = iterator->second;
localEdges.smarter_erase(iterator);
localEdges.insert(std::make_pair(-1, second));
1个回答

4

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接