Si vous ne vous souciez pas de l'espace supplémentaire, essayez de pousser les éléments dans un map
. Chaque fois que vous trouvez votre élément déjà dans le map, vous pouvez signaler l'erreur directement.
map occurrences;
for (vector::const_iterator cit = test.begin(); cit != test.end(); ++cit)
if ((++occurrences[*cit]) == 2)
cout << "ERREUR"; // Vous pouvez même signaler quel élément est répété ici facilement, en utilisant *cit.
Notez que ce code émet correctement le message une seule fois par élément répété (même si l'élément est répété plusieurs fois), comme l'a intelligemment amendé Tony Delroy. Bien que cette méthode compte correctement l'occurrence de chaque chaîne de caractères dans toute la collection (ce qui peut être nécessaire), cette méthode est sujette à un débordement d'un int
s'il y a 2^31 copies du même élément (ou plus). Vous pouvez utiliser un long long int
à la place si tel est le cas et que vous voulez vraiment le décompte de chaque chaîne de caractères.
Si vous n'êtes pas intéressé par le décompte de chaque chaîne de caractères, une méthode encore plus efficace est d'utiliser un set
, comme le suggère smerlin (car il ne maintient que la chaîne de caractères, pas une paire de chaîne de caractères et d'int
comme le fait le map
), réduisant ainsi les besoins en espace... et émettant le message d'erreur chaque fois que vous trouvez l'élément dans le set:
set occurrences;
for (vector::const_iterator cit = test.begin(); cit != test.end(); ++cit)
if (false == occurrences.insert(*cit).second)
cout << "ERREUR"; // Vous pouvez même signaler quel élément est répété ici facilement, en utilisant *cit.
Si vous voulez éliminer le problème avant qu'il ne se produise, insérez les éléments dans un set
à la place. Il élimine automatiquement les doublons. Mais faites attention, les éléments dans un set
sont triés, donc vous ne conservez pas l'ordre d'insertion. Si cela ne vous dérange pas, un set
est bien meilleur, car la recherche en lui et la lecture des éléments dans un ordre trié sont beaucoup plus efficaces.