如何从C ++多图表中删除特定对?

时间:2010-10-17 07:58:33

标签: c++ containers multimap

#include <map>

...

multimap<char,int> first;

first.insert(pair<char,int>('a',10));
first.insert(pair<char,int>('b',15));
first.insert(pair<char,int>('b',20));
first.insert(pair<char,int>('c',25));

说我现在想要删除我刚刚添加到地图中的一对。

我有一些示例可以删除整个密钥条目,对于密钥“b”,将删除“b”,15和“b”,20。

但是,删除的代码是什么,比如说'b',20?

2 个答案:

答案 0 :(得分:33)

您可以使用std::multimap<char, int>::equal_range,它将为您提供包含具有特定键的所有对的迭代器范围。因此,如果你查找'b',你将获得一个迭代器范围,其中包含所有以'b'为关键字的对。

然后你可以通过擦除迭代器来简单地迭代范围,并擦除你认为合适的任何一对。

multimap<char,int> mymap;

mymap.insert(pair<char,int>('a',10));
mymap.insert(pair<char,int>('b',15));
mymap.insert(pair<char,int>('b',20));
mymap.insert(pair<char,int>('c',25));

typedef multimap<char, int>::iterator iterator;
std::pair<iterator, iterator> iterpair = mymap.equal_range('b');

// Erase (b,15) pair
//
iterator it = iterpair.first;
for (; it != iterpair.second; ++it) {
    if (it->second == 15) { 
        mymap.erase(it);
        break;
    }
}

答案 1 :(得分:2)

如果您需要在第一次匹配后继续迭代,您需要首先检索到下一个元素的迭代器,因为已删除的迭代器已失效。

从 C++11 开始,实现此目的的一种方法是使用擦除函数的返回值,该函数是删除最后一个元素之后的元素的迭代器(或 multimap::end,如果最后一个元素去掉了)。请注意,基于键的版本返回的是删除的元素数,而不是迭代器。

建立在有价值的 Charles Salvia 答案之上,展示了如何擦除 (b,15 ) 对,你得到

multimap<char,int> mymap;

mymap.insert(pair<char,int>('a',10));
mymap.insert(pair<char,int>('b',15));
mymap.insert(pair<char,int>('b',20));
mymap.insert(pair<char,int>('c',25));

typedef multimap<char, int>::iterator iterator;
std::pair<iterator, iterator> iterpair = mymap.equal_range('b');

// Erase (b,15) pair
//
iterator it = iterpair.first;
for (; it != iterpair.second; ) {
    if (it->second == 15) { 
        it=mymap.erase(it);
    }
    else
        ++it;
}