Подтвердить что ты не робот

В std:: multiset есть функция или алгоритм, чтобы стереть только один образец (одноименный или дублированный), если элемент найден

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

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

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

4b9b3361

Ответ 1

auto itr = my_multiset.find(value);
if(itr!=my_multiset.end()){
    my_multiset.erase(itr);
}

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

Ответ 2

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

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

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

Ответ 3

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

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

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

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

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


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

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

Псевдо-код:

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

if( distance( pit.first, pit.second ) >= 2 ) {
    mymultiset.erase( pit.first );
}

Ответ 4

Мы можем сделать что-то вроде этого:

multiset<int>::iterator it, it1;
it = myset.find(value);
it1 = it;
it1++;
myset.erase (it, it1);

Ответ 5

 if(my_multiset.find(key)!=my_multiset.end())
   my_multiset.erase(my_multiset.equal_range(key).first);

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

Ответ 6

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

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