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 ?
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.
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 );
}
multiset < int > :: iterator it , it1 ;
it = myset.find ( value ) ;
it1 = it ;
it1 ++ ;
myset.erase ( it , it1 ) ;
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 ++
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.