2012-09-28 60 views
5

我預計下面的兩個無序集被評估爲等效,但令我驚訝的是他們不是。發生這種情況的原因是兩個字符串存儲在同一個散列桶中,並且運算符==會對該集合中的項目進行順序比較。這應該被認爲是std :: unordered_set中的一個錯誤嗎?有沒有人有這個優雅的解決方法?爲什麼這些C++ STL無序集合被認爲是相等的?

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

使用哪種C++標準庫實現?這是早期版本的Visual C++標準庫實現中的已知問題(此問題已在Visual C++ 2012中得到解決)。 –

+0

對不起,我忘了包括那個。我正在使用Visual C++ 2010.您是否有任何關於此問題的文檔?我搜索時找不到任何東西。謝謝!! – user1707438

+1

@ user1707438這裏是詹姆斯的[回覆](http://stackoverflow.com/a/2774236/241631)到一個早先的問題,其中包含'unordered_set'的相等比較器。 – Praetorian

回答

4

這是Visual C++ 2010標準庫實現中的一個已知錯誤。此錯誤已在Visual C++ 2012中得到修復;如果這個bug影響到你,那麼可能值得升級。 (有a bug on Microsoft Connect,但它似乎已經消失;我試圖弄清楚發生了什麼)

作爲一種解決方法,考慮您是否確實需要使用無序關聯容器 - 它們的性能不是必然比有序的關聯容器的性能更好。

+0

解決錯誤的編譯器不是解決方法。 – Dani

+3

@Dani:實際上,簡單的解決方法通常是處理編譯器和庫錯誤的最佳方法。每個編譯器和庫實現都有bug(很多),任何足夠大的項目都會碰到一個或多個這樣的bug。 –

相關問題