2012-04-26 78 views
4

以下是我正在運行的代碼,使用g ++ 4.6和-std=c++0x的std :: unordered_map ::開始(INT n)的行爲

std::unordered_map<int, int> um; 

um.insert(std::make_pair(42, 43)); 
um.insert(std::make_pair(342, 343)); 
um.insert(std::make_pair(142, 143)); 
um.insert(std::make_pair(242, 243)); 

for(auto e : um) 
std::cout << e.first << std::endl; 

此打印:

242 
342 
42 
142 

現在我可以訪問242與um.begin()->firstum.begin(0)->first。 342可以使用um.begin(1)->first訪問。但um.begin(2)->firstum.begin(3)->first使程序崩潰。通過不同的號碼,我可以訪問um.begin(2)->first。 我無法向自己解釋這種行爲。我是否使用um.begin(int)錯誤?

+0

我很懷疑'int'被使用。它更可能是引用'std :: size_t'的'size_type'內部typedef。 – 2012-04-26 15:30:08

+0

@MatthieuM。你是對的。但它並沒有太大的變化 – TeaOverflow 2012-04-26 16:16:43

回答

13

你得到這個很困惑。 begin(1)僅適用於在底層哈希表結構訪問特定無序容器一個非常特殊的建築,並返回一個當地迭代。這與以某種「隨機訪問」方式訪問任何特定元素無關,這是你根本無法做到的。

所有你可以用無序的容器做的是遍歷整個集合或find通過密鑰的特定元素。元素不能以任何特定順序訪問,因此名稱「無序」。

可以使用本地迭代器遍歷每個桶[begin(n), end(n)),當然,你必須使用你使用任何範圍內處理空箱相同的成語。可用bucket_count成員函數發現可用桶的總數。

注意,在大多數情況下,你應該期待一個桶包含零個或一個元素。通過成員函數load_factor,每個桶的平均元素數量可用(並可配置)。

+0

非常感謝您澄清! – TeaOverflow 2012-04-26 14:49:07

相關問題