web-dev-qa-db-fra.com

Dans std :: multiset, existe-t-il une fonction ou un algorithme pour effacer un seul échantillon (unifier ou dupliquer) si un élément est trouvé?

C’est peut-être une copie, mais je n’ai rien trouvé à la recherche: Lorsque erase(value) est appelé sur std::multiset, tous les éléments avec la valeur trouvée sont supprimés. La seule solution à laquelle je pouvais penser est:

std::multiset<int>::iterator hit(mySet.find(5));
if (hit!= mySet.end()) mySet.erase(hit);

C'est bon mais j'ai pensé qu'il pourrait y avoir mieux. Des idées ?

50
Martin
auto itr = my_multiset.find(value);
if(itr!=my_multiset.end()){
    my_multiset.erase(itr);
}

J'imagine qu'il existe un moyen plus propre d'accomplir la même chose. Mais cela fait le travail.

18
user2251346

Je voudrais essayer le suivant.

Appelez d'abord equal_range() pour rechercher la plage d'éléments égale à la clé.

Si la plage renvoyée est non vide, alors erase() une plage d'éléments (c'est-à-dire le erase() qui prend deux itérateurs) où:

  • le premier argument est l’itérateur du 2e élément de la plage renvoyée (c’est-à-dire un .first passé retourné) et 

  • le deuxième argument en tant que .second celui de l'itérateur de paires d'intervalle renvoyé.


Editez après avoir lu le commentaire (merci) de templatetypedef :

Si un doublon (par opposition à tous) est supposé être supprimé: Si la paire renvoyée par equal_range() a au moins deux éléments, alors erase() le premier élément en passant le .first de la paire renvoyée à la version unique de erase():

Pseudo-code:

pair<iterator, iterator> pit = mymultiset.equal_range( key );

if( distance( pit.first, pit.second ) >= 2 ) {
    mymultiset.erase( pit.first );
}
2
Arun
multiset < int > :: iterator it , it1 ;
it = myset.find ( value ) ;
it1 = it ;
it1 ++ ;
myset.erase ( it , it1 ) ;
1
knock_out
 if(my_multiset.find(key)!=my_multiset.end())
   my_multiset.erase(my_multiset.equal_range(key).first);

C’est le meilleur moyen auquel je puisse penser pour supprimer une seule instance dans un multiset en c ++

1
varun kunchakuri

Essaye celui-là:

multiset<int> s;
s.erase(s.lower_bound(value));

Tant que vous pouvez vous assurer que la variable value existe dans l'ensemble. Ça marche.

0
Strange