Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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++ C++;:向量和列表的混合:类似std::rope的东西?_C++_Arrays_Boost_Stl_Vector - Fatal编程技术网

C++ C++;:向量和列表的混合:类似std::rope的东西?

C++ C++;:向量和列表的混合:类似std::rope的东西?,c++,arrays,boost,stl,vector,C++,Arrays,Boost,Stl,Vector,当存储一堆项目时,我不需要随机访问容器,我使用的是std::list,这基本上是好的。然而,有时(特别是当我只是将条目向后推,而从不删除中间的某个位置时),我希望我有一些性能更好的结构来添加条目 std::vector不好,因为: 它必须重新分配,如果它不再适合 对于大量的数据来说,它实际上不起作用(因为你不可能总是获得非常大的连续可用内存块) std::list不好,因为: 它对每一次推回都进行分配。这很慢,会导致大量内存碎片 所以,介于两者之间的东西就是我想要的 基本上,我想要类似于

当存储一堆项目时,我不需要随机访问容器,我使用的是
std::list
,这基本上是好的。然而,有时(特别是当我只是将条目向后推,而从不删除中间的某个位置时),我希望我有一些性能更好的结构来添加条目

std::vector
不好,因为:

  • 它必须重新分配,如果它不再适合
  • 对于大量的数据来说,它实际上不起作用(因为你不可能总是获得非常大的连续可用内存块)
std::list
不好,因为:

  • 它对每一次推回都进行分配。这很慢,会导致大量内存碎片
所以,介于两者之间的东西就是我想要的

基本上,我想要类似于
std::list
之类的东西。或者可以将其设置为
4096/sizeof(T)
,而不是
100
。也可能是
std::list
,第一个向量可以很小,然后进一步的向量可以增长。实际上,我想在使用中隐藏它,所以我可以做一个
mycontainer.push_back(x)

有点类似,但在标准中不可用


Boost中是否有类似的功能?

您是否考虑过使用
std::deque
?它的元素不是连续存储的,但允许对元素进行随机访问;如果只在序列的开头或结尾插入元素,它可能比std::vector提供更好的性能。这是O(1)次推回,几乎总是比std::list快。(是的,而且它还节省内存)


std::list最重要的特性是从中间进行恒定时间的删除/插入。如果您不需要它,请选择std::vector。

为什么不使用SGI发行版的rope类呢?许可证中有一个广告条款,但除此之外,为什么不呢?@Albert,你说你只是用push_back存储了一堆物品。那么std::vector有什么问题?为什么您更喜欢std::list?@ybungalobill:
std::vector
不适用于非常大的数据块,因为内存是连续分配的。@马特:我希望它在任何地方都能工作(即在所有可能实现STL的编译器上)。@AshleysBrain:这给了我什么好处(除了在前面不断插入我不关心的内容)?如果你有大量的
向量
,而且复制成本很高,那么在
推回过程中偶尔发生的重新分配可能会使
向量
成为一个不可接受的选择。不,这不是O(1)用于推回向量。它是O(n)。平均来说,它应该是O(logn)。对于大数据量来说,它根本不起作用,因为它只能分配一大块连续内存。而std::list的速度很慢,因为它必须为每一次回推进行分配。@Albert:不,在末尾插入(即,
回推
的作用)已摊销的恒定时间复杂度(O(1))。这意味着在末尾插入一个元素平均需要固定的时间。只有在需要重新分配时,在末尾插入才需要线性时间。vector的实现使得重新分配发生的频率相对较低,通常是通过使底层存储呈指数级增长。@Albert:不,仍然是O(1)。考虑一个大小为1000和容量为1000的向量。插入元素并重新分配,将容量增加到2000。重新分配需要1000个时间单位。然后可以在固定时间内插入999个元素。重新分配的时间(1000次单位)。在下次重新分配之前可以执行的1+999=1000次插入上摊销;1000/1000=1。[是的,这很简单,并非所有的实现都使用2倍的比例因子;例如,我认为VC++使用1.5倍,但这就是它的工作原理。]@Albert it's O(1),阅读摊销分析。如果插入N个对象,那么最多只能执行2N个复制操作。令人惊讶的是,很少有人知道std::deque,但它确实应该是较大数据集的默认值。我真的应该更了解STL!我一直想知道
deque
的用途以及它(内部)的区别从
向量(我一直认为它只是一个块,当你在前面插入时,开始索引可能会改变)。IIRC,MSVC使用了一个可笑的块大小,使它像一个链表。请查看编译器之间的一致实现。