Tal vez esto es un duplicado, pero no encontré nada de búsqueda: Cuando erase(value)
se pidió a std::multiset
todos los elementos con el valor encontrado se eliminan. La única solución que se me ocurre es:
std::multiset<int>::iterator hit(mySet.find(5));
if (hit!= mySet.end()) mySet.erase(hit);
Esto está bien, pero pensé que podría haber algo mejor. Algunas ideas ?
multimap
: ¿hay alguna garantía sobre qué elementosfind
devuelve? (¿Orden de inserción? ¿Incluso después de tal borrado? ¿Depende de la implementación?)Respuestas:
auto itr = my_multiset.find(value); if(itr!=my_multiset.end()){ my_multiset.erase(itr); }
Me imagino que hay una forma más limpia de lograr lo mismo. Pero esto hace el trabajo.
fuente
Prueba este:
multiset<int> s; s.erase(s.lower_bound(value));
Siempre que pueda asegurarse de que las
value
salidas en el conjunto. Eso funciona.fuente
if(my_multiset.find(key)!=my_multiset.end()) my_multiset.erase(my_multiset.equal_range(key).first);
Esta es la mejor manera que se me ocurre de eliminar una sola instancia en un conjunto múltiple en c ++
fuente
Intentaría lo siguiente.
Primera llamada
equal_range()
para encontrar el rango de elementos que igualan a la clave.Si el rango devuelto no está vacío, entonces
erase()
un rango de elementos (es decir, elerase()
que toma dos iteradores) donde:el primer argumento es el iterador del segundo elemento en el rango devuelto (es decir, un pasado
.first
devuelto) yel segundo argumento como el del iterador del par de rango devuelto
.second
.Edite después de leer el comentario de templatetypedef (¡Gracias!):
Si se supone que se elimina un duplicado (a diferencia de todos): si el par devuelto por
equal_range()
tiene al menos dos elementos, entonceserase()
el primer elemento pasa el .first del par devuelto a la versión de iterador único deerase()
:Pseudocódigo:
pair<iterator, iterator> pit = mymultiset.equal_range( key ); if( distance( pit.first, pit.second ) >= 2 ) { mymultiset.erase( pit.first ); }
fuente
Esto funcionó para mí:
si val existe en el multi-set.
fuente
Podemos hacer algo como esto:
multiset<int>::iterator it, it1; it = myset.find(value); it1 = it; it1++; myset.erase (it, it1);
fuente
De hecho, la respuesta correcta es:
my_multiset.erase(my_multiset.find(value));
fuente