2016-02-10 41 views
1

我需要合併兩個unordered_map s而不更改順序。 例如,如何在不改變元素順序的情況下合併兩個unordered_maps?

unordered_map<int,int> map1 ,map2, map3; 

MAP1含有:< 4,4> 2,2 <>

MAP2包含:< 3,3> < 1,1>

MAP1和MAP2是與map3合併。

所以我MAP3應該包含< 4,4> < 2,2> < 3,3> < 1,1>

map<int,int>::iterator it = map3.begin(); 
std::merge(map1.begin(),map1.end(),map2.begin(),map2.end(),inserter(map3,it)); 

不過MAP3秩序正在發生變化。 我試過用std :: merge並插入,但沒有按照上面的要求工作。有人可以幫助我做到這一點。或者我在合併和插入時犯了一些錯誤?

回答

5

std::unordered_map不保證任何種類的訂單,而std::map總是按鍵排序(儘管您可以指定自己的比較功能)。它看起來像你想要的項目在他們的插入順序。在這種情況下,您可以將數據推送到std::vector,但您必須放棄映射類型提供的次線性操作。

+0

所以你的意思是說,無序地圖會在插入時對鍵進行某種排序? – kayle

+1

不,實際上'std :: unordered_map'是一個[哈希表](https://en.wikipedia.org/wiki/Hash_table)。我不確定標準是如何明確地指定它的,但它肯定走得像一個散列表,像一個散列表一樣嘎嘎嘎嘎。它可能會按散列順序迭代(並且在同一個散列桶中按照插入的順序),但這當然不能保證。所以當你從'begin'迭代到'end'時,你可以依靠所有的元素,但這就是它。 – alcedine

0

地圖元素的順序依賴於其鍵和平衡樹算法,但不依賴源地圖元素順序。如果您想保存訂單,請改用std::vector<std::pair<inr,int>>

0

標準::合併工作假設兩個已經排序的範圍(在你的情況下,兩個未分類的地圖)實現線性時間表現。由於其實施,使用未排序的地圖將不會提供所需的結果。

相關問題