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

マップに追加したペアの1つを削除したいとします。

キーエントリ全体を削除する例があります。キー「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

最初の一致後に反復を続行する必要がある場合は、消去されたイテレータが無効になるため、最初に次の要素へのイテレータを取得する必要があります。

これを実現する1つの方法は、C ++ 11以降、最後に削除された要素(または、最後の要素が削除された場合はmultimap :: end)に続く要素へのイテレーターであるerase関数の戻り値を使用することです。 。キーベースのバージョンは、イテレータではなく、消去された要素の数を返すことに注意してください。

貴重なチャールズサルビアの答えの上に構築し、(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 に答える