2012-09-28 11 views
5

Spodziewałem się, że dwa nieuporządkowane zestawy poniżej zostaną ocenione jako równoważne, ale ku mojemu zdziwieniu nie są. Dzieje się tak, ponieważ dwa łańcuchy są przechowywane w tym samym buforze mieszającym, a operator == wykonuje sekwencyjne porównanie elementów w zestawie. Czy należy to uznać za błąd w std :: unordered_set? Czy ktoś ma eleganckie obejście tego problemu?Dlaczego te nieuznane zestawy C++ STL nie są uznawane za równe?

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

Korzystanie z wdrożenia biblioteki standardowej C++? Jest to znany problem w starszych wersjach implementacji biblioteki standardowej Visual C++ (Ten problem został rozwiązany w programie Visual C++ 2012). –

+0

Przepraszam, zapomniałem o tym. Używam Visual C++ 2010. Czy masz jakieś dokumentacji wokół problemu? Nie mogłem znaleźć niczego, gdy szukałem. Dzięki!! – user1707438

+1

@ user1707438 Oto James '[odpowiedź] (http://stackoverflow.com/a/2774236/241631) na wcześniejsze pytanie, które zawiera komparator równości dla 'unordered_set'. – Praetorian

Odpowiedz

4

Jest to znany błąd w implementacji biblioteki standardowej Visual C++ 2010. Ten błąd został naprawiony w Visual C++ 2012; jeśli ten błąd dotyczy Ciebie, warto rozważyć ulepszenie. (Było a bug on Microsoft Connect, ale wydaje się, że zniknął, staram się dowiedzieć, co się z nim stało).

W celu obejścia tego problemu należy rozważyć, czy rzeczywiście trzeba użyć nieuporządkowanych pojemników asocjacyjnych - ich wydajność nie jest wystarczająca. niekoniecznie lepsze niż wydajność zamówionych pojemników asocjacyjnych.

+0

Rozwiązaniem problemu złego kompilatora nie jest obejście. – Dani

+3

@Dani: W rzeczywistości proste obejścia są często najlepszym sposobem radzenia sobie z błędami kompilatora i biblioteki. Każda implementacja kompilatora i biblioteki zawiera błędy - wiele z nich, a każdy wystarczająco duży projekt jest związany z jednym lub kilkoma z tych błędów. –

Powiązane problemy