C ++:vector和list之间的混合:类似于std :: rope?

时间:2010-09-22 16:49:38

标签: c++ arrays boost stl vector

当存储一堆项目并且我不需要随机访问容器时,我使用的是std::list,这很好。但是,有时候(特别是当我只是将条目推回到后面并且从不删除中间的某个地方时),我希望我有一些结构可以更好地添加条目。

std::vector很糟糕,因为:

  • 如果它不再适合,它必须重新分配。
  • 它并不适用于大量数据(因为你不能总是获得非常大的连续可用内存块)。

std::list很糟糕,因为:

  • 它在每个push_back上进行分配。这很慢,导致大量内存碎片化。

所以,介于两者之间的是我想要的东西。

基本上,我想要std::list< boost::array<T, 100> >左右的东西。或者也许代替100,让它为4096/sizeof(T)。也许也std::list< std::vector<T> >,第一个矢量可以很小,然后可以进一步增长。实际上我想隐藏在使用中,所以我可以做一个mycontainer.push_back(x)

std::rope有点类似,但标准中没有。

在Boost中有这样的东西吗?

2 个答案:

答案 0 :(得分:10)

您是否考虑过使用std::deque?它的元素不是连续存储的,但它允许随机访问元素;如果您只是在序列的开头或结尾插入元素,它可能会提供比std::vector更好的性能。

答案 1 :(得分:1)

是的,它叫做std :: vector。这是O(1)时间push_back,几乎总是比std :: list快。 (是的,它也有记忆效率)

std :: list最重要的特性是从中间删除/插入常量时间。如果你不需要它,请选择std :: vector。