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

Jim*_*ler 20 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));
Run Code Online (Sandbox Code Playgroud)

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

我有一些例子来删除整个密钥条目,对于密钥'b',它将删除'b',15和'b',20.

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

Cha*_*via 35

您可以使用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;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 您可以继续迭代yes,但实际擦除的迭代器无效,因此您需要首先检索到下一个元素的迭代器. (2认同)
  • 如果所有键都相同,这会不会具有线性复杂性?例如,假设我们插入以下对 - ('k', 1), ('k', 2), ('k', 3), ('k', 4) 现在,如果我想删除对 ('k', 4),我将遍历所有对直到找到 ('k', 4)。 (2认同)

Paz*_*Paz 5

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

从 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;
}
Run Code Online (Sandbox Code Playgroud)