2012-09-28 6 views
5

Je m'attendais à ce que les deux ensembles non ordonnés ci-dessous soient évalués comme équivalents, mais à ma grande surprise ils ne le sont pas. Cela se produit car les deux chaînes sont stockées dans le même compartiment de hachage et l'opérateur == effectue une comparaison séquentielle pour les éléments de l'ensemble. Cela devrait-il être considéré comme un bug dans std :: unordered_set? Quelqu'un at-il une solution de contournement élégante pour cela?Pourquoi ces ensembles non triés STL C++ ne sont-ils pas considérés comme égaux?

std::unordered_set<std::string> a,b; 
a.insert("500666"); 
a.insert("961021"); 
b.insert("961021"); 
b.insert("500666"); 

if (a == b) // condition is evaulated as false 
{ 
} 
+7

Utilisation de l'implémentation de la bibliothèque standard C++ Ce problème est connu dans les anciennes versions de l'implémentation de la bibliothèque standard Visual C++ (Ce problème a été résolu dans Visual C++ 2012). –

+0

Désolé, j'ai oublié d'inclure cela. J'utilise Visual C++ 2010. Avez-vous de la documentation sur le problème? Je n'ai rien trouvé quand j'ai cherché. Merci!! – user1707438

+1

@ user1707438 Voici la réponse de James [http://stackoverflow.com/a/2774236/241631] à une question précédente qui contient un comparateur d'égalité pour 'unordered_set'. – Praetorian

Répondre

4

Ceci est un bogue connu dans l'implémentation Visual C++ 2010 Standard Library. Ce bogue a été corrigé dans Visual C++ 2012; Si ce bug vous affecte, il pourrait être intéressant de se pencher sur la mise à niveau. (Il y avait a bug on Microsoft Connect, mais il semble avoir disparu, j'essaie de comprendre ce qui lui est arrivé.)

Pour contourner le problème, demandez-vous si vous avez vraiment besoin d'utiliser les conteneurs associatifs non ordonnés - leur performance n'est pas nécessairement mieux que la performance des conteneurs associatifs ordonnés.

+0

Une solution à un mauvais compilateur n'est pas des solutions de contournement. – Dani

+3

@Dani: En réalité, les solutions de contournement simples sont souvent la meilleure façon de gérer les bogues de compilation et de bibliothèque. Chaque implémentation de compilateur et de bibliothèque a des bogues - beaucoup d'entre eux, et tout projet suffisamment important est lié à un ou plusieurs de ces bogues. –

Questions connexes