矢量用许多块实现,没有调整大小副本

时间:2012-02-07 21:31:37

标签: c++ data-structures

我想知道是否可以实现类似stl的向量,其中存储以块的形式完成,而不是从原始块分配更大的块和副本,您可以在不同的地方保留不同的块,并重载operator []和迭代器的operator ++,以便向量的用户不知道块不是连续的。

当超出现有容量时,这可以保存副本。

2 个答案:

答案 0 :(得分:4)

你会寻找std :: deque

请参阅GotW #54 Using Vector and Deque

  

在大多数情况下,更喜欢使用deque(争议)

包含演示行为的基准

最新的C ++ 11标准说:

  

§23.2.3序列容器

     

[2]序列容器为程序员提供了不同的复杂性权衡,应该相应地使用。   vector或array是默认情况下应该使用的序列容器的类型。 list或forward_list   当从序列中间频繁插入和删除时应该使用。德克是   当大多数插入和删除发生在开始或结束时选择的数据结构   顺序。

FAQ > Prelude's Corner > Vector or Deque? (intermediate)说:

  
      
  • 向量只能有效地向最终添加项目,任何在向量中间或开头插入项目的尝试都是非常低效的。 deque可以在开始时以及在恒定时间结束时插入项目,O(1),这非常好。中间的插入效率仍然很低,但如果需要这样的功能,则应使用列表。 deque在前面插入的方法是push_front(),也可以使用insert()方法,但push_front更清晰。

  •   
  • 就像插入一样,矢量前面的删除效率很低,但是deque提供了从前面开始的恒定时间擦除

  •   
  • deque更有效地使用内存。考虑内存碎片,向量需要N个连续的内存块来保存其项目,其中N是项目数,块是单个项目的大小。如果向量需要5或10兆字节的内存,这可能是一个问题,但可用内存被分段到没有5或10兆字节连续内存的点。 deque没有这个问题,如果没有足够的连续内存,deque将使用一系列较小的块。

  •   
     

[...]

答案 1 :(得分:1)

是的,这是可能的。

你知道绳子吗?这就是你所描述的,对于字符串(大字符串==绳子,开个笑话?)。绳索不是标准的一部分,但出于实际目的:它可以在现代编译器上使用。您可以使用它来表示文本编辑器的完整内容。

看看这里:STL Rope - when and where to use

永远记住:

  • (性能)优化的第一条规则是:不要这样做
  • 第二条规则(仅适用于专家):现在不要这样做。