【问题标题】:Is there a data structure that doesn't allow duplicates and also maintains order of entry?是否存在不允许重复并保持输入顺序的数据结构?
【发布时间】:2010-10-22 22:25:04
【问题描述】:

重复: Choosing a STL container with uniqueness and which keeps insertion ordering

我正在寻找一种数据结构,它的行为类似于集合,它不允许插入重复项,但也知道插入项的顺序。它基本上是集合和列表/向量的组合。

我只会使用列表/向量并自己检查重复项,但我们需要快速验证重复项,因为结构的大小可能会变得非常大。

【问题讨论】:

    标签: c++ data-structures


    【解决方案1】:

    看看Boost.MultiIndex。您可能需要为此编写一个包装器。

    【讨论】:

    • Greg 在重复问题中的解决方案似乎不需要包装器。不过,感谢您为我指明了最无痛的方向。
    【解决方案2】:

    将插入顺序作为索引的Boost.Bimap 应该可以工作(例如 boost::bimap )。如果要从数据结构中删除对象,则需要单独跟踪下一个广告订单值。

    【讨论】:

      【解决方案3】:

      编写您自己的包含向量和集合的类似乎是显而易见的解决方案 - 没有 C++ 标准库容器可以满足您的需求。

      【讨论】:

        【解决方案4】:

        Java 以有序集合的形式提供此功能。我不认为 C++ 有这个,但自己实现并不难。 Sun 的人对 Java 类所做的就是扩展散列表,以便将每个项目同时插入到散列表中并保存在双链表中。这样做的开销很小,特别是如果您预先分配用于构造链表的项目。

        如果我在你的位置,我会编写一个类,它要么使用私有向量来存储项目,要么自己在类中实现一个哈希表。当任何项目要插入到集合中时,检查它是否在哈希表中,如果有这样的项目,可以选择替换其中的项目。然后在哈希表中找到旧项,更新列表以指向新元素,就完成了。

        要插入新元素,您也可以这样做,但您必须在列表中使用新元素 - 您不能重复使用旧元素。

        要删除一个项目,你需要重新排列列表以指向它,然后释放列表元素。

        请注意,您应该可以直接从元素中获取您感兴趣的元素的链表部分,这样您就不必每次必须移动或更改时都要走链子一个元素。

        如果您预计在程序运行期间会更改很多这些项目,您可能希望保留列表项目的列表,这样您就可以仅占据该列表的头部,而不是每次都分配内存添加一个新元素。

        你可能想看看跳舞链接算法。

        【讨论】:

          【解决方案5】:

          我只使用两种数据结构,一种用于顺序,一种用于标识。 (如果您存储值,一个可以指向另一个,这取决于您想要最快的操作)

          【讨论】:

            【解决方案6】:

            听起来像是OrderedDictionary 的工作。

            【讨论】:

              【解决方案7】:

              快速的重复验证似乎是这里的关键部分。我可能会使用某种类型的地图/字典,并自己跟踪插入顺序作为实际数据。因此,关键是您要插入的“数据”(然后对其进行哈希处理,并且您不允许重复的键),并将地图的当前大小作为“数据”放入。当然,这仅在您没有任何删除时才有效。如果您需要,只需在每次插入时增加一个外部变量,相对顺序会告诉您插入的时间。

              不一定漂亮,但也不难实现。

              【讨论】:

                【解决方案8】:

                假设您在这里谈论的是 ANSI C++,我要么自己编写,要么使用组合和委托来包装用于数据存储的映射和用于插入顺序的键向量。根据数据的特性,您也许可以使用插入索引作为映射键,避免使用向量。

                【讨论】:

                  猜你喜欢
                  • 2013-01-06
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2016-11-09
                  • 2021-06-23
                  相关资源
                  最近更新 更多