2017-02-06 98 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