我想知道是否可以实现类似stl的向量,其中存储以块的形式完成,而不是从原始块分配更大的块和副本,您可以在不同的地方保留不同的块,并重载operator []和迭代器的operator ++,以便向量的用户不知道块不是连续的。
当超出现有容量时,这可以保存副本。
答案 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
永远记住: