Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 保留插入顺序但不允许重复的STL容器_C++_Stl - Fatal编程技术网

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

C++ 保留插入顺序但不允许重复的STL容器,c++,stl,C++,Stl,可能重复: 我正在寻找一个STL容器,它保留插入顺序(无排序),但不允许重复。有吗?如果没有我可以用来定制的技巧?没有。在没有排序或散列的情况下检测重复是一个非常昂贵的操作。 目前没有这样的容器,但是您可以通过持有 STD::vector 和 >,创建一个自己的容器。 < P>不需要重新创建轮子,考虑使用容器。然后,您可以为您的心脏内容定义各种索引。性能差异(如果您担心的话)应该是最小的。我知道您特别要求使用STL容器,但是boost已经提供了一个容器,它可以通过其有序的(唯一的索引来满足您的

可能重复:


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

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

目前没有这样的容器,但是您可以通过持有<代码> STD::vector 和<<代码> STD::在一个类中设置< < /C> >,创建一个自己的容器。

< P>不需要重新创建轮子,考虑使用容器。然后,您可以为您的心脏内容定义各种索引。性能差异(如果您担心的话)应该是最小的。

我知道您特别要求使用STL容器,但是boost已经提供了一个容器,它可以通过其有序的(唯一的索引来满足您的需要。我绝对值得一看,而不是重新发明轮子

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


祝你好运。

std::set对元素进行排序,对吗?@Gunner,但它也会排序。就像维迪奇所说的。如果你的对象很大,考虑在容器中存储指针,并向集合CTR提供你自己的排序函数。好的建议。如果对象足够大,您不需要它们的两个副本,那么您可以在集合中保留对象,并在向量中保留指向集合元素的指针或迭代器。@RC:嗯,我的建议并不理想,因为对象实际上存储了两次。更好的解决方案是从头创建具有所需属性的容器。但是,编写一个新的容器需要付出更多的努力。@Mike:如果容器要存储小对象,例如char或bools(对于bools std::vector使用位打包),那么使用指针的解决方案效率会降低。两倍的内存开销(同样,对于包含的小对象)也有一个缺点。所以唯一真正的解决办法是制作一个新的容器。@Vlad:是的,这就是为什么我用“如果对象很大”来限定我的建议。比指针小的对象在两个容器中的值存储效率肯定会更高。这个容器是只接收新元素还是也需要允许删除元素?当您说它保留插入顺序时,您可能希望对其进行迭代。你想从第一个迭代到最后一个还是相反?我将插入一次(不删除)并多次读取(在元素上迭代)。我认为这是一种非常常见的模式,这让我感到困惑,为什么语言制造商还没有实现这样的功能。另一个我也遇到过的非常常见的模式是一个字典,它不允许重复键,但也可以按插入顺序进行编辑。如果有人知道我描述的事情,请告诉我。