保留插入顺序但不允许重复的 STL 容器 [重复]

Posted

技术标签:

【中文标题】保留插入顺序但不允许重复的 STL 容器 [重复]【英文标题】:STL Container that preserves order of insertion but allows no duplicates [duplicate] 【发布时间】:2011-06-08 12:19:25 【问题描述】:

可能重复:A std::map that keep track of the order of insertion?

我正在寻找一个保留插入顺序(无排序)但不允许重复的 STL 容器。有吗?如果没有任何我可以用来定制的技巧?

【问题讨论】:

这个容器是只接收新元素还是允许删除元素? 当您说它保留了插入顺序时,您可能想要对其进行迭代。你想从头到尾迭代还是反过来? 我将插入一次(不删除)并多次读取(迭代元素) 我认为这是一种非常普遍的模式,以至于让我感到困惑为什么语言的制造者还没有实现这样的功能。我也遇到的另一个非常常见的模式是一个字典,它不允许键重复,但也可以按插入顺序进行迭代。如果有人知道我所描述的事情,请告诉我。 【参考方案1】:

目前还没有这样的容器,但您可以通过将std::vectorstd::set 放在一个类中以便宜的方式创建自己的容器。

【讨论】:

如果您的对象很大,请考虑在容器中存储指针,并为集合 ctr 提供您自己的排序功能。 好建议。如果对象足够大以至于您不想要它们的两个副本,那么您可以将对象保留在集合中,并在向量中保留指向集合元素的指针或迭代器。 @RC:好吧,我的建议并不理想,因为对象实际上存储了两次。一个更好的解决方案是从头开始创建具有所需属性的容器。然而,编写一个新容器需要更多的努力。 @Mike:如果容器要存储 small 对象,例如 chars 或 bools(对于 bools,std::vector 使用位打包,则使用指针的解决方案效率会降低)。两倍大的内存开销有一个缺点(同样,对于包含的小对象)。所以唯一真正的解决方案是制作一个新容器。 @Vlad:是的,这就是为什么我用“如果对象很大”来限定我的建议。小于指针的对象肯定会更有效地按值存储在两个容器中。【参考方案2】:

我知道你特别要求一个 STL 容器,但是 boost 已经提供了一个 multindex 容器,它通过 ordered_unique 索引来满足你的需求。我绝对值得一看,而不是重新发明***。

我只是想指出一个好的选择。

祝你好运。

【讨论】:

【参考方案3】:

无需重新发明***,考虑使用boost::multi_index 容器。然后,您可以为您的内容定义各种索引。性能差异(如果您担心的话)应该很小。

【讨论】:

【参考方案4】:

没有。在不进行排序或散列的情况下检测重复项是一项非常昂贵的操作。

【讨论】:

std::set 对元素进行排序,对吧? @Gunner 但它也可以排序。就像 Nemanja 说的那样。

以上是关于保留插入顺序但不允许重复的 STL 容器 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

STL--set使用用法

关联容器

ListSetMap是继承自Collection吗?

Mapreduce - 保留输入顺序

STL 容器的概念

list,set,map有啥区别