В std :: multiset есть функция или алгоритм для удаления только одного образца (единственного или дублирующего), если элемент найден - PullRequest
56 голосов
/ 07 февраля 2012

Возможно, это дубликат, но я не нашел ничего в поиске: Когда erase(value) вызывается на std::multiset, все элементы с найденным значением удаляются. Единственное решение, о котором я мог подумать:

std::multiset<int>::iterator hit(mySet.find(5));
if (hit!= mySet.end()) mySet.erase(hit);

Это нормально, но я подумал, что может быть лучше. Есть идеи?

Ответы [ 6 ]

21 голосов
/ 12 июля 2016
auto itr = my_multiset.find(value);
if(itr!=my_multiset.end()){
    my_multiset.erase(itr);
}

Я бы предположил, что есть более чистый способ сделать то же самое. Но это делает работу.

4 голосов
/ 20 ноября 2018

Попробуйте это:

multiset<int> s;
s.erase(s.lower_bound(value));

Пока вы можете убедиться, что value выходит из набора. Это работает.

1 голос
/ 27 июля 2016
 if(my_multiset.find(key)!=my_multiset.end())
   my_multiset.erase(my_multiset.equal_range(key).first);

Это лучший способ удалить один экземпляр в мультимножестве в c ++

.
1 голос
/ 24 декабря 2015
multiset < int > :: iterator it , it1 ;
it = myset.find ( value ) ;
it1 = it ;
it1 ++ ;
myset.erase ( it , it1 ) ;
1 голос
/ 07 февраля 2012

Я бы попробовал следующее.

Первый вызов equal_range(), чтобы найти диапазон элементов, равный ключу.

Если возвращаемый диапазон не пуст, то erase() диапазон элементов (то есть erase(), который принимает два итератора), где:

  • первый аргумент - итератор для второго элемента в возвращаемом диапазон (то есть одно прошлое .first возвращено) и

  • второй аргумент в качестве возвращенного итератора пары диапазонов .second one.


Редактировать после прочтения templatetypedef (Спасибо!) Комментарий:

Если предполагается удалить один (в отличие от всех) дубликат: если пара, возвращаемая equal_range(), имеет хотя бы два элемента, то erase() первый элемент, передавая .first возвращенной пары в версия с одним итератором erase():

Псевдо-код:

pair<iterator, iterator> pit = mymultiset.equal_range( key );

if( distance( pit.first, pit.second ) >= 2 ) {
    mymultiset.erase( pit.first );
}
0 голосов
/ 05 сентября 2014

На самом деле правильный ответ:

my_multiset.erase (my_multiset.find (значение));

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...