std::multimap and equal_range

std::multimap and equal_range

本文关键字:range equal and multimap std      更新时间:2023-10-16

我对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. 范围中删除某些行
  3. 我需要从
  4. 范围更改其他行的键

关于1,由于"对已删除元素的引用和迭代器无效",我如何删除这些元素?我是否应该将特定的迭代器推入某个容器,并在循环结束后对其进行迭代?我看到了这个答案,但它似乎有点粗俗/丑陋/容易出错/等等…

关于2,既然"愚蠢"的方法(显然)不起作用,那么什么是实现我需要的好方法呢?一旦我解决了问题1,我就可以删除元素并在原来的位置插入新的元素,但是如果我错误地插入了一个与我刚刚删除的元素具有相同键的项目,这可能不会打乱迭代吗?…

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

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