#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?
答案 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;
}