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