c++ - repetidos - En std:: multiset hay una función o algoritmo para borrar solo una muestra(unica o duplicada) si se encuentra un elemento
funcion para eliminar caracteres en c (5)
Quizás esto es un duplicado pero no encontré nada buscando: cuando se llama a erase(value) en std::multiset todos los elementos con el valor encontrado se borran. 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 ?
De hecho, la respuesta correcta es:
my_multiset.erase (my_multiset.find (value));
Intentaría lo siguiente.
Primero llame a equal_range() para encontrar el rango de elementos que equivale a la clave.
Si el rango devuelto no está vacío, erase() un rango de elementos (es decir, el erase() que toma dos iteradores) donde:
el primer argumento es el iterador al segundo elemento en el rango devuelto (es decir, un pasado.
.firstdevuelto) yel segundo argumento como el iterador del par de rango devuelto
.second.
Edite después de leer el comentario de templatetypedef (¡Gracias!):
Si se supone que se debe eliminar un duplicado (a diferencia de todos): si el par devuelto por equal_range() tiene al menos dos elementos, entonces erase() el primer elemento pasando el primero del par devuelto a la versión del iterador único del erase() :
Pseudo-código:
pair<iterator, iterator> pit = mymultiset.equal_range( key );
if( distance( pit.first, pit.second ) >= 2 ) {
mymultiset.erase( pit.first );
}
if(my_multiset.find(key)!=my_multiset.end())
my_multiset.erase(my_multiset.equal_range(key).first);
Esta es la mejor manera en que puedo pensar para eliminar una sola instancia en un multiset en c ++
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.
multiset < int > :: iterator it , it1 ;
it = myset.find ( value ) ;
it1 = it ;
it1 ++ ;
myset.erase ( it , it1 ) ;