Vielleicht ist dies ein Duplikat, aber ich habe keine Suche gefunden: Wenn erase(value)
aufgerufen wird, werden std::multiset
alle Elemente mit dem gefundenen Wert gelöscht. Die einzige Lösung, an die ich denken könnte, ist:
std::multiset<int>::iterator hit(mySet.find(5));
if (hit!= mySet.end()) mySet.erase(hit);
Das ist in Ordnung, aber ich dachte, es könnte besser sein. Irgendwelche Ideen ?
multimap
: Gibt es eine Garantie dafür, welche Elementefind
zurückgegeben werden? (Reihenfolge der Einfügung? Auch nach einer solchen Löschung? Implementierung abhängig?)Antworten:
auto itr = my_multiset.find(value); if(itr!=my_multiset.end()){ my_multiset.erase(itr); }
Ich würde mir vorstellen, dass es einen saubereren Weg gibt, dasselbe zu erreichen. Aber das erledigt den Job.
quelle
Probier diese:
multiset<int> s; s.erase(s.lower_bound(value));
Solange Sie sicherstellen können, dass die
value
Ausgänge im Set. Das funktioniert.quelle
if(my_multiset.find(key)!=my_multiset.end()) my_multiset.erase(my_multiset.equal_range(key).first);
Dies ist der beste Weg, den ich mir vorstellen kann, um eine einzelne Instanz in einem Multiset in C ++ zu entfernen
quelle
Ich würde folgendes versuchen.
Rufen Sie zuerst
equal_range()
auf, um den Bereich der Elemente zu ermitteln, die dem Schlüssel entsprechen.Wenn der zurückgegebene Bereich nicht leer ist, dann
erase()
ein Bereich von Elementen (dh der,erase()
der zwei Iteratoren benötigt), wobei:Das erste Argument ist der Iterator für das zweite Element im zurückgegebenen Bereich (dh eine zurückgegebene Vergangenheit
.first
) unddas zweite Argument als das des zurückgegebenen Bereichspaar-Iterators
.second
.Nach dem Lesen des Kommentars von templatetypedef (Danke!) Bearbeiten :
Wenn ein (im Gegensatz zu allen) Duplikat entfernt werden soll: Wenn das von zurückgegebene Paar
equal_range()
mindestens zwei Elemente enthält,erase()
übergibt das erste Element das erste des zurückgegebenen Paares an eine einzelne Iteratorversion vonerase()
:Pseudocode:
pair<iterator, iterator> pit = mymultiset.equal_range( key ); if( distance( pit.first, pit.second ) >= 2 ) { mymultiset.erase( pit.first ); }
quelle
Das hat bei mir funktioniert:
wenn val im Multi-Set vorhanden ist.
quelle
Wir können so etwas tun:
multiset<int>::iterator it, it1; it = myset.find(value); it1 = it; it1++; myset.erase (it, it1);
quelle
In der Tat ist die richtige Antwort:
my_multiset.erase(my_multiset.find(value));
quelle