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:该标准明确规定,在任何一端插入/删除都不会导致引用/指针无效。