2009-12-15 3 views
4

Je cherche une STL (mais pas augmenter) récipient, qui, après les opérations suivantes contiendra 2 éléments: « abc » et « xyz »:Quel conteneur STL utiliser si je veux qu'il ignore les éléments dupliqués?

std::XContainer<string> string_XContainer; 
string_XContainer.push_back("abc"); 
string_XContainer.push_back("abc"); 
string_XContainer.push_back("xyz"); 

Soit dit en passant, j'ai besoin juste pour pour appeler le string_XContainer.size() à la fin, pour obtenir le nombre total de chaînes uniques. Alors peut-être que je n'ai même pas besoin d'un conteneur, et il y a une façon plus élégante de le faire?

Répondre

18

std::set est celui que vous recherchez. Un ensemble contiendra au plus une instance de chaque élément, en fonction d'une fonction de comparaison que vous définissez.

Ce serait une approche pour obtenir le nombre de chaînes uniques. De votre exemple, les chaînes étaient déjà dans l'ordre trié? Si c'est le cas, vous pouvez simplement créer un tableau (ou une autre structure simple) et utiliser l'algorithme std::unique.

+0

Oui, l'ensemble est le conteneur pour cela. @Igor Oks, mais notez que l'ordre des éléments insérés ne sera pas maintenu dans l'ensemble, je suppose que ce n'est pas nécessaire. – Naveen

+0

Il ne maintiendra pas l'ordre d'insertion mais il maintiendra un ordre faible strict. –

+0

Ne pas oublier que unique fonctionne uniquement sur les gammes triées. Vous pouvez tester si une plage est triée en utilisant la commande 'std :: adjacent_find (iBegin, iEnd, std :: greater ()) == iEnd' et n'appliquez' sort' que si ce n'est pas le cas. –

Questions connexes