2017-02-06 165 views
2

我有一個Java程序,我想將其轉換爲C++。所以,在Java代碼中使用了一個Linkedhashmap數據結構,我想將它轉換爲C++。在C++中是否有與LinkedHashmap等效的數據類型?相當於C++中的LinkedHashmap?

我試過使用std::unordered_map,但是它並沒有保持插入的順序。

+0

不,你沒有。這是一個醜陋的數據結構開始,難怪沒有人建議將其標準化 –

+0

@DavidHaim嗯。那麼,我如何創建一個具有可預測的迭代順序的哈希映射? – emadalamoudi

+2

你需要問自己,爲什麼在哈希表中的插入順序首先是重要的。 –

回答

6

C++不提供集合模板,其行爲將模仿Java的LinkedHashMap<K,V>,因此您需要與映射分開維護順序。

這可以通過保持在std::list<std::pair<K,V>>的數據,並且通過鍵保持一個單獨的std::unordered_map<k,std::list::iterator<std::pair<K,V>>>地圖項目的快速查找來實現:

  • 在添加項目,添加相應的鍵/值配對到列表的末尾,並將鍵映射到迭代器std::prev(list.end())
  • 在按鍵刪除項目時,查找其迭代器,將其從列表中刪除,然後刪除映射。
  • 在替換項目時,首先從無序映射中查找列表迭代器,然後用新的鍵值對替換其內容。
  • 在迭代值時,只需迭代std::list<std::pair<K,V>>即可。
+0

謝謝,我認爲這是我需要做的。它會增加更多的複雜性,但至少它仍然會維持秩序。再次感謝 – emadalamoudi

+0

由於這是可以接受的答案,我仍然發現有必要指出這比LinkedHashMap更糟糕:1)通過鍵2查找時的額外間接性)迭代器擦除所需的散列查找。其中條目包含兩個鏈接列表(插入順序和散列桶)的指針的集成解決方案既沒有這些缺點。有關係嗎?很難說/取決於。所提出的解決方案*嚴格地遜色於這樣的LinkedHashMap嗎?是。 – misberner