簡體   English   中英

我不明白std :: tr1 :: unordered_map

[英]I don't understand std::tr1::unordered_map

我需要一個關聯容器,它讓我通過一個字符串索引一個特定的對象,但這也保持了插入的順序,所以我可以通過它的名字查找一個特定的對象,或者只是迭代它並按照我插入的相同順序檢索對象他們。

我認為鏈接列表和哈希映射的這種混合應該可以完成這項工作,但在我嘗試使用std::tr1::unordered_map之前,我認為它是以我所描述的方式工作,但事實並非如此。 那么有人可以解釋一下unordered_map的含義和行為嗎?


@wesc:我確定std :: map是由STL實現的,而我確定std :: hash_map不在STL中(我認為舊版本的Visual Studio將它放在名為stdext的命名空間中)。

@cristopher:所以,如果我做對了,差異在於實現(以及性能),而不是它在外部的行為方式。

您已經詢問了為什么制作Boost :: MultiIndex的規范原因:列出按鍵快速查找的插入順序。 Boost MultiIndex教程:列出快速查找

您需要以兩種方式索引關聯容器:

  • 廣告訂單
  • 字符串比較

嘗試Boost.MultiIndexBoost.Intrusive 我沒有用這種方式,但我認為這是可能的。

提升無序容器的文檔

不同之處在於如何生成查找的方法。

在map / set容器中, operator<用於生成有序樹。

在無序容器中,使用operator( key ) => index

有關其工作原理的說明,請參見散列。

對不起,請閱讀您的上次評論錯誤。 是的,hash_map不在STL中,map是。 但unordered_map和hash_map與我讀過的內容完全相同。

map - > log(n)插入,檢索,迭代是有效的(並通過密鑰比較排序)

hash_map / unordered_map - >常量時間插入和檢索,迭代時間不保證高效

這些都不適合你自己,因為地圖根據關鍵內容而不是插入順序排序事物(除非你的密鑰包含有關其中插入序列的信息)。

您必須執行您所描述的內容(list + hash_map),或創建具有插入序列號加上適當比較函數的密鑰類型。

認為 unordered_map和hash_map或多或少是相同的。 區別在於STL沒有正式擁有hash_map(你正在使用的東西可能是編譯器特定的東西),所以unordered_map是該遺漏的修復。

unordered_map就是......無序的。 你不能依賴它來保留迭代的任何順序。

您確定std :: hash_map存在於所有 STL實現中嗎? SGI STL實現了它,但是無論如何,GNU g ++都沒有它(它位於__gnu_cxx命名空間中)。 據我所知,hash_map一直是非標准的,現在tr1正在修復它。

@wesc:STL有std :: map ...那么與unordered_map的區別是什么? 我不認為STL會實現兩次相同的東西,並以不同的方式調用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM