Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.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++_Data Structures - Fatal编程技术网

C++ 使用多个块实现的矢量,无需调整副本大小

C++ 使用多个块实现的矢量,无需调整副本大小,c++,data-structures,C++,Data Structures,我想知道是否有可能实现一个类似stl的向量,其中存储是分块完成的,而不是分配一个更大的块并从原始块复制,您可以在不同的位置保留不同的块,并重载操作符[]以及迭代器的运算符+,因此向量的用户不知道这些块不是连续的 这可以在超出现有容量时保存副本 您将寻找std::deque 看 在大多数情况下,更喜欢使用deque(有争议) 包含用于证明行为的基准 最新的C++11标准规定: §23.2.3序列容器 [2] 序列容器为程序员提供了不同的复杂性权衡,应该相应地使用。 向量或数组是默认情况下应使用的序

我想知道是否有可能实现一个类似stl的向量,其中存储是分块完成的,而不是分配一个更大的块并从原始块复制,您可以在不同的位置保留不同的块,并重载操作符[]以及迭代器的运算符+,因此向量的用户不知道这些块不是连续的


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

您将寻找std::deque

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

包含用于证明行为的基准

最新的C++11标准规定:

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

说:

    >P>向量只能有效地将项添加到末尾,任何试图在向量中间或开始时插入项的尝试通常都是非常低效的。strong>一个数据块可以在开始和结束时插入项目,时间固定,O(1),这非常好。中间的插入仍然是低效的,<强>但是如果需要这样的功能,应该使用一个列表< <强> >。deque在前面插入的方法是push_front(),也可以使用insert()方法,但push_front更清晰

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

  • deque能更有效地使用内存。考虑内存碎片,向量需要n个连续的内存块来保存其项目,其中n是项目的数量,而块是单个项目的大小。如果向量需要5或10 MB的内存,但可用内存碎片化到没有5或10 MB连续内存的程度,则这可能是一个问题deque没有这个问题,如果连续内存不足,deque将使用一系列较小的块。

[……]

是的,这是可能的

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

请看这里:

永远记住:

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

谢谢您的回复,但我真的不想排队。我希望所有的正常向量行为(随机访问、下标运算符等),但我希望底层的实现是在块中。@user500093:我建议你试试这个,而不是幻想ifs和buts?deque是一个随机访问容器,它支持与vector相同的接口,但是:1。在某些情况下效率更高2。非连续块中的存储。请看@user500093:它确实支持随机访问和订阅。