是否存在不允许重复的数据结构并且还保持了输入顺序?

时间:2009-04-30 17:50:38

标签: c++ data-structures

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

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

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

8 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

我只使用两个数据结构,一个用于订单,一个用于标识。 (如果存储值,可以指向另一个,具体取决于您希望哪个操作最快)

答案 4 :(得分:0)

听起来像是OrderedDictionary的工作。

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

Java以有序集的形式提供此功能。我不认为C ++有这个,但实现起来并不困难。 Sun员工对Java类所做的是扩展哈希表,使每个项目同时插入哈希表并保存在双链表中。这方面的开销非常小,特别是如果您预先分配用于构建链接列表的项目。

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

要插入新元素,您必须执行相同的操作,除非您必须在列表中使用新元素 - 您不能重复使用旧元素。

要删除项目,请重新排序列表以指向它,并释放列表元素。

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

如果您预计在程序运行期间更改了很多这些项目,您可能希望保留列表项的列表,这样您只需占用此列表的头部,而不是每次都有内存分配添加新元素。

您可能希望查看跳舞链接算法。