Być może jest to duplikat, ale nie znalazłem niczego szukającego: kiedy erase(value)
jest wywoływany, std::multiset
wszystkie elementy ze znalezioną wartością są usuwane. Jedyne rozwiązanie, jakie przychodzi mi do głowy, to:
std::multiset<int>::iterator hit(mySet.find(5));
if (hit!= mySet.end()) mySet.erase(hit);
To jest w porządku, ale pomyślałem, że może być lepiej. Jakieś pomysły ?
multimap
: czy jest jakaś gwarancja, które elementy zostanąfind
zwrócone? (Kolejność wstawiania? Nawet po takim skasowaniu? Realizacja zależna?)Odpowiedzi:
auto itr = my_multiset.find(value); if(itr!=my_multiset.end()){ my_multiset.erase(itr); }
Wyobrażam sobie, że istnieje czystszy sposób osiągnięcia tego samego. Ale to wykonuje swoją pracę.
źródło
Spróbuj tego:
multiset<int> s; s.erase(s.lower_bound(value));
Tak długo, jak możesz zapewnić, że
value
wyjdzie w zestawie. To działa.źródło
if(my_multiset.find(key)!=my_multiset.end()) my_multiset.erase(my_multiset.equal_range(key).first);
To najlepszy sposób, w jaki mogę wymyślić, aby usunąć pojedyncze wystąpienie z zestawu wielu w c ++
źródło
Spróbowałbym następujących.
Pierwsze wywołanie,
equal_range()
aby znaleźć zakres elementów równy kluczowi.Jeśli zwrócony zakres nie jest pusty, to
erase()
zakres elementów (tj. Ten,erase()
który przyjmuje dwie iteratory), gdzie:pierwszy argument to iterator do drugiego elementu w zwróconym zakresie (tj.
.first
zwrócona jedna przeszłość ) idrugi argument jako iterator zwracanej pary zakresów
.second
.Edytuj po przeczytaniu komentarza templatetypedef (dzięki!):
Jeśli jeden (w przeciwieństwie do wszystkich) duplikatów ma zostać usunięty: Jeśli para zwrócona przez
equal_range()
ma co najmniej dwa elementy, toerase()
pierwszy element, przekazując .first zwróconej pary do wersji z pojedynczym iteratoremerase()
:Pseudo kod:
pair<iterator, iterator> pit = mymultiset.equal_range( key ); if( distance( pit.first, pit.second ) >= 2 ) { mymultiset.erase( pit.first ); }
źródło
To zadziałało dla mnie:
jeśli val istnieje w zestawie wielokrotnym.
źródło
Możemy zrobić coś takiego:
multiset<int>::iterator it, it1; it = myset.find(value); it1 = it; it1++; myset.erase (it, it1);
źródło
auto itr=ms.find(value); while(*itr==value){ ms.erase(value); itr=ms.find(value); }
Wypróbuj ten Spowoduje to usunięcie wszystkich duplikatów dostępnych w zestawie wielokrotnym.
źródło
W rzeczywistości prawidłowa odpowiedź to:
my_multiset.erase(my_multiset.find(value));
źródło