【问题标题】:c++ data structure to keep the insert order and capable of lookup by keyc ++数据结构保持插入顺序并能够按键查找
【发布时间】:2013-11-21 06:51:35
【问题描述】:

是否有任何数据结构(C++03 或 Boost)可以保持插入顺序并能够按键查找。我目前正在这样做:

struct Foo {
  vector<string> v;  // keep the key order by insert time
  map<string, string> m;  // <key, value>
};

Foo foo;
foo.v.push_back("key1");
foo.m["key1"] = "value1";
foo.v.push_back("key2");
foo.m["key2"] = "value2";

有了这个,我可以在矢量对象中保持我想要的顺序,并且仍然能够快速查找地图对象。缺点是我必须同时维护矢量对象和地图对象,这很难闻。

【问题讨论】:

  • 您可以使用带有std::find 的向量。不过,按键查找效率不高。
  • 只使用这样一个有地图和矢量的结构有什么问题?您可以创建一个抽象 insertfinddelete 的类,以便 insert 将 k、v 放入地图并推动矢量,delete 从地图和矢量中删除,@987654329 @ 在地图上进行查找。我想最大的问题是:你会用这个结构做什么?为什么插入顺序很重要?

标签: c++ data-structures


【解决方案1】:

一个可能的选项是Boost Multi-index containers library。当我有类似的要求时,我过去曾使用过它们。模板设置需要一点时间来适应,但之后效果很好。

【讨论】:

    【解决方案2】:

    你只能通过一个属性来组织组织,所以如果你想按插入时间查找并且希望按字符串查找,那么你需要两个数据结构

    如果您需要按字符串顺序进行迭代 - 那么地图就可以了 - 但如果您将按时间迭代并且仅按字符串查找比 std::unordered_map 会更快

    如果你没有做很多插入/删除,那么 std::vector 就可以了 - 否则考虑一个 std::list

    还可以考虑让一个结构在第二个结构中包含一个迭代器,这样您就可以轻松地从两个结构中删除,很可能将向量迭代器放在 unordered_map 中

    list<string, string> insertOrder
    unordered_map<string, list<string, string>::iterator> fastLookup
    

    您可以将其包装在 template&lt;K,V&gt; 类中,以便您可以将其重用于其他类并将协调保持在一个地方

    【讨论】:

    • 我认为这是错误的。您可以实现一个顺序保留哈希。 CRuby 在 1.9 中保留了哈希顺序(但不幸的是,不是按照规范,如果我没记错的话,也不是在 64 位实现中)。所以@Stan 的问题仍然悬而未决:是否有人在 C++ 中发布了保持顺序的哈希?
    • @JoachimWuttke - 我相信这基本上是同一件事,但使用来自 std.顺序保留哈希有一个哈希,它有指向链表的指针作为节点
    猜你喜欢
    • 2013-10-03
    • 1970-01-01
    • 2013-06-03
    • 1970-01-01
    • 2013-10-21
    • 2012-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多