2012-09-28 6 views
5

Mi aspettavo che i due set non ordinati di seguito fossero valutati come equivalenti, ma con mia sorpresa non lo sono. Ciò si verifica perché le due stringhe sono memorizzate nello stesso bucket hash e l'operatore == esegue un confronto sequenziale per gli elementi nel set. Questo dovrebbe essere considerato un bug in std :: unordered_set? Qualcuno ha una soluzione elegante per questo?Perché questi set non ordinati di C++ STL sono considerati uguali?

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

Utilizzando quale implementazione della libreria standard C++? Questo è un problema noto nelle versioni precedenti dell'implementazione della libreria standard di Visual C++ (questo problema è stato corretto in Visual C++ 2012). –

+0

Scusa, ho dimenticato di includerlo. Sto usando Visual C++ 2010. Hai qualche documentazione sul problema? Non ho trovato nulla quando ho cercato. Grazie!! – user1707438

+1

@ user1707438 Ecco James '[answer] (http://stackoverflow.com/a/2774236/241631) a una domanda precedente che contiene un comparatore di uguaglianza per 'unordered_set'. – Praetorian

risposta

4

Questo è un bug noto nell'implementazione della libreria standard di Visual C++ 2010. Questo bug è stato corretto in Visual C++ 2012; se questo bug ti riguarda, potrebbe valere la pena di esaminare l'aggiornamento. (C'era a bug on Microsoft Connect, ma sembra essere svanito, sto cercando di capire cosa gli è successo.)

Come soluzione, considera se è davvero necessario utilizzare i contenitori associativi non ordinati: le loro prestazioni non sono necessariamente meglio delle prestazioni dei contenitori associativi ordinati.

+0

Una soluzione per un compilatore non valido non è soluzione alternativa. – Dani

+3

@Dani: In realtà, semplici soluzioni alternative sono spesso il modo migliore per gestire i bug del compilatore e della libreria. Ogni implementazione di compilatore e libreria ha dei bug, molti di questi, e qualsiasi progetto sufficientemente grande è destinato a scovare uno o più di questi bug. –