矢量实现了许多块和没有调整大小的副本

vector implemented with many blocks and no resize copy

本文关键字:调整 副本 实现 许多块      更新时间:2023-10-16

我想知道是否有可能实现一个类似stl的向量,其中存储是以块为单位完成的,而不是分配一个更大的块并从原始块复制,而是将不同的块保留在不同的位置,并重载运算符[]和迭代器的运算符++,这样向量的用户就不会意识到这些块是不连续的。

这可以在超出现有容量时保存一个副本。

您将查找std::deque

请参阅GotW#54使用矢量和Deque

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

包含展示行为的基准

最新的C++11标准说:

§23.2.3序列容器

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

常见问题>前奏曲的角落>Vector还是Deque?(中间)说:

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

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

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

[…]

是的,这是可能的。

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

看看这里:STL绳索-何时何地使用

永远记住:

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