29
#include <map>

...

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

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

我有删除整个键条目的示例,对于键 'b' 将同时删除 'b',15 和 'b',20。

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

4

2 回答 2

46

您可以使用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;
    }
}
于 2010-10-17T08:00:12.003 回答
3

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

从 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;
}
于 2021-02-01T11:26:16.423 回答