Ответ 1
auto itr = my_multiset.find(value);
if(itr!=my_multiset.end()){
my_multiset.erase(itr);
}
Я бы предположил, что есть более чистый способ сделать то же самое. Но это делает работу.
Возможно, это дубликат, но я ничего не нашел.
Когда erase(value)
вызывается на std::multiset
, все элементы со найденным значением удаляются. Единственное решение, о котором я мог думать, это:
std::multiset<int>::iterator hit(mySet.find(5));
if (hit!= mySet.end()) mySet.erase(hit);
Это нормально, но я думал, что может быть лучше. Любые идеи?
auto itr = my_multiset.find(value);
if(itr!=my_multiset.end()){
my_multiset.erase(itr);
}
Я бы предположил, что есть более чистый способ сделать то же самое. Но это делает работу.
Попробуйте это:
multiset<int> s;
s.erase(s.lower_bound(value));
Пока вы можете убедиться, что value
выходит из набора. Это работает.
Я бы попробовал следующее.
Сначала вызовите 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 );
}
Мы можем сделать что-то вроде этого:
multiset<int>::iterator it, it1;
it = myset.find(value);
it1 = it;
it1++;
myset.erase (it, it1);
if(my_multiset.find(key)!=my_multiset.end())
my_multiset.erase(my_multiset.equal_range(key).first);
Это лучший способ, который я могу придумать, чтобы удалить один экземпляр в мультимножестве в С++
На самом деле правильный ответ:
my_multiset.erase(my_multiset.find(значение));