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.
.first
devuelto) 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 ) ;