Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.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++ std::deque何时需要重新分配?_C++_Deque - Fatal编程技术网

C++ std::deque何时需要重新分配?

C++ std::deque何时需要重新分配?,c++,deque,C++,Deque,据我所知,std::deque将其元素存储在块中(虽然它依赖于实现,但这是我在大多数源代码中读到的),而不是std::vector,后者在大多数情况下使用单个内存块 因此,std::vector在插入过程中遇到重新分配是非常合理的。但是,我无法描述任何需要为std::deque重新分配的情况,因为当当前内存被破坏时,它只是以新的内存块重新开始 有谁能给我一个例子,在这个例子中,std::deque由于对其执行了一些操作而需要重新分配吗?我想到的一件事是,当您在deque上进行插入,并且插入所需的

据我所知,
std::deque
将其元素存储在块中(虽然它依赖于实现,但这是我在大多数源代码中读到的),而不是
std::vector
,后者在大多数情况下使用单个内存块

因此,
std::vector
在插入过程中遇到重新分配是非常合理的。但是,我无法描述任何需要为
std::deque
重新分配的情况,因为当当前内存被破坏时,它只是以新的内存块重新开始


有谁能给我一个例子,在这个例子中,
std::deque
由于对其执行了一些操作而需要重新分配吗?

我想到的一件事是,当您在deque上进行插入,并且插入所需的页面已满时会发生什么?cplusplus.com说明关于deques的插入函数

If the insertion happens at the beginning or the end of the sequence, all iterators 
related to this container are invalidated, but pointers and references remain valid, 
referring to the same elements they were referring to before the call. If the 
insertion happens anywhere else in the deque, all iterators, pointers and references 
related to this container are invalidated.
<> P>我真正理解的是,一切都是无效的,插入是在中间,对我来说,这听起来像是底层数据结构正在发生的事情。我不确定这是否是一次重新分配,但至少是一次轮班拷贝插入

谁能给我提供std::deque需要重新分配的案例 对其执行某些操作的结果

在一个典型的场景中,永远不会。虽然未指定
deque
的精确实现细节,但要保留迭代器/指针/引用无效*和算法要求,对于任何需要将现有内存块重新分配到更大或更小内存块的场景来说,都是不实际的

[特别关注指针/引用无效,因为这告诉我们更多关于内存中必须发生的事情。迭代器可以产生一些异常,使其有效性与
deque
]的内存表示分离]

试着设身处地为实施者着想。如果您试图重新分配内存块,如何实现诸如
push_front
push_back
和扩展
resize
这样的功能,而不使任何指向
deque
的现有指针失效

同样地,如果您试图将现有内存块重新分配到较小的大小,则保留对
前弹出
后弹出
以及收缩
调整大小
(仅使指向已删除元素的指针无效)的类似要求

gotcha部分,也是您可能发现最有可能重新分配的地方,是插入到
deque
的中间。这是一个所有指向
deque
的指针都可以失效的地方,在那里可以重新分配
deque的
内容(可能,不一定实用)。只有在这种特殊情况下,作为
deque
实现者,我们才能使指向仍然存在的元素的指针失效,因为我们甚至可以自由地重新分配任何现有内存块。但这种情况不太可能发生,因为高效的
insert
实现通常只想洗牌和移动元素,而不是实际重新分配它们所在的内存块

所有这些要求结合在一起,将实现限制为Sutter描述的类型,即使他在这方面有点马虎,并且掩盖了理论部分。这有点像C++03代码经常想当然地认为,
std::vector
总是连续的,即使它没有指定,因为
std::vector
的算法和迭代器要求使得连续表示几乎成为唯一的实际选择


因此,从理论上讲,有人可能在遵守这些要求的同时,以某种方式偷偷地在某处进行重新分配。但在实践中,这几乎是不可能的,而且绝对不切实际,所以你很难找到这样的<代码> DeQue/Cult>实现。

看看这里:我不认为C++标准需要DEGO如何做内部的事情。理论上,它可以用一个向量来表示某些事情……它更多的是用迭代器无效来表示的。但是拉维的观点仍然站得住脚。HS所认为的应该是什么并不一定是遵守标准的实现。@DeviceFan:该标准明确规定,在任何一端插入/删除都不会导致引用/指针无效。