2013-09-21 28 views
6

在C++的「標準庫」中,有沒有能力按插入順序保存順序的任何「關聯」(即「關鍵值」)容器/數據結構?C + 11關聯容器,保持插入順序?

但是,我已經看到了幾個主題,看起來,大多數在C++ 11之前。

一些建議使用「boost :: multi_index」,但如果可能的話,我會「寧願」使用標準容器/結構。我看到C++ 11有幾個顯然是「無序」的關聯容器:link

這些中的任何一個,通過某種方式,「可配置」,使得它們只按插入順序排序?

謝謝!

Ç

+2

只需使用一個unordered_map和一個向量 – aaronman

+1

你在尋找'std :: vector >'? –

+0

所以你想要等同於Java的* LinkedHashMap *? – hyde

回答

1

您正在混合隨機線性訪問。不是很好的牀友。

只需使用vector/list(即插入順序)以及使用索引到前者的映射。

+2

他們是非常好的同牀異母,非常高興有什麼時候,需要這個,並且讓這樣的容器在實施方面也是微不足道的。如果C++沒有,我有點驚訝。示例:http://docs.oracle.com/javase/7/docs/api/java/util/LinkedHashMap.html – hyde

+0

@hyde - 它只是將兩個數據結構鏈接在一起。兩個 - 不是一個。 –

+0

HashMap已經是內部的幾個數據結構的組合,所以我沒有看到有什麼區別......插入有序的hashmap仍然需要相當多的代碼,應該包裝在一個類中,並且當然必須提供完全相同的接口作爲正常的無序hashmap。請注意,與保持排序順序不同,保持插入順序不會影響算法效率。 – hyde

0

否;這種能力顯然是以表演的名義犧牲的。

等效項目的順序需要在包括rehashes在內的操作中保留,但無法指定原始順序。理論上,您可以使用std::rotate或類似方法在每次插入後將對象按所需順序排列。顯然不切實際,但它證明缺乏能力有點武斷。

最好的辦法是將子序列保留在內部容器中。您可以使用迭代器適配器來遍歷這樣的「深度」容器,就好像它是單個序列一樣。這種效用大概可以在Boost中找到。

0

第 在無序映射中,也沒有按照插入順序存儲。

您可以使用載體保持密鑰的軌道!