J'ai refait Nate Kohl's de profilage et a obtenu des résultats différents. Pour mon cas de test, directement tri le vecteur est toujours plus efficace que l'utilisation d'un ensemble. J'ai ajouté une nouvelle méthode plus efficace, à l'aide d'un unordered_set.
Gardez à l'esprit que la unordered_set méthode ne fonctionne que si vous avez une bonne fonction de hachage pour le type dont vous avez besoin uniqued et triés. Pour les entiers, c'est facile! (La bibliothèque standard fournit un hachage par défaut qui est tout simplement l'identité de la fonction.) Aussi, n'oubliez pas de tri à la fin, car unordered_set est, ainsi, non ordonnée :)
J'ai fait quelques recherches à l'intérieur de l'ensemble et unordered_set mise en œuvre et a découvert que le constructeur en fait la construction d'un nouveau nœud pour chaque élément, avant de vérifier sa valeur pour déterminer si elle devrait en fait être inséré (dans Visual Studio de la mise en œuvre, au moins).
Voici les 5 méthodes:
f1: Juste à l'aide de vecteur, de tri + unique
sort( vec.begin(), vec.end() );
vec.erase( unique( vec.begin(), vec.end() ), vec.end() );
f2: Convertir (à l'aide d'un constructeur)
set<int> s( vec.begin(), vec.end() );
vec.assign( s.begin(), s.end() );
f3: Convertir (manuellement)
set<int> s;
for (int i : vec)
s.insert(i);
vec.assign( s.begin(), s.end() );
f4: Convertir unordered_set (à l'aide d'un constructeur)
unordered_set<int> s( vec.begin(), vec.end() );
vec.assign( s.begin(), s.end() );
sort( vec.begin(), vec.end() );
f5: Convertir unordered_set (manuellement)
unordered_set<int> s;
for (int i : vec)
s.insert(i);
vec.assign( s.begin(), s.end() );
sort( vec.begin(), vec.end() );
J'ai fait le test avec un vecteur de 100 000 000 d'entiers choisis au hasard dans l'intervalle [1,10], [1,1000], et [1,100000]
Les résultats (en secondes, le plus petit est mieux):
range f1 f2 f3 f4 f5
[1,10] 1.6821 7.6804 2.8232 6.2634 0.7980
[1,1000] 5.0773 13.3658 8.2235 7.6884 1.9861
[1,100000] 8.7955 32.1148 26.5485 13.3278 3.9822