为什么std::deque不是一个在索引0之前保留内存的向量
Why is std::deque not a vector with memory reserved before index 0?
据我所知,deque背后的动机是提供一个具有高效push_front
的随机访问容器。
与deque相比,vector的常见优点包括更快的遍历和at()
,但主要是它的C兼容性,因为它保证了连续内存。Deque没有,因为它是内存块的集合,每个内存块都包含多个值。
我很困惑。为什么deque不是像向量一样构建的,而是除了在索引size-1
之后保留的内存之外,还在索引0
之前保留的内存?这将保证连续的内存,启用高效的push_front
,甚至在解引用迭代器时避免额外的间接性。
为了最大限度地减少插入过程中的偏移,要偏移的包含值将取决于插入点。如果在size()/2
之前的索引n
处插入,则将值向左移动至n
。否则,将n
之后的值右移。
我错过了什么,以至于deque是一个值数组的集合,而不是一个大数组?
根据维基百科,您所描述的实际上是一种可能的实现,至少在一般情况下是这样。
然而,C++标准提出了一些要求,基本上禁止将其作为std::deque
的实现;[deque.modifiers]状态:
在deque的两端插入。。。对引用deque元素的有效性没有影响。
(感谢@BenjaminLindley!)
相关文章:
- 在 C++ 中访问数组负索引处的内存不会返回垃圾
- 必须为 C++20 协程帧保留多少内存?
- 为异步发送缓冲区保留内存(提升 asio 套接字)
- 访问"std::vector"的保留但未调整大小的内存作为原始内存是否安全?
- std::vector<std::vector<int>>:调试断言失败。C++矢量下标超出范围保留内存
- 如何在Windows和更高版本上保留内存,并将文件映射到内存中
- 结构中的C++数组指针保留内存位置,但丢失所有值
- 是否更正PInvoke签名以使用带有C#保留内存的嵌套结构
- C++ - 关闭应用程序后保留内存
- 如何在 Windows 映射程序的 DLL 之前保留内存区域?
- 需要释放具有保留内存的 c++ Do 局部变量
- (C++)循环:不保留内存的用户输入
- OpenCL:减少示例,并保留内存对象/将cuda代码转换为OpenCL
- 如何为向量的向量保留内存
- 为结构体保留内存空间时
- 如何在构造时为std::vector保留内存?
- 如何为一个非常大的筛保留内存?
- 在堆中保留内存错误
- 为什么std::deque不是一个在索引0之前保留内存的向量
- 如何判断已提交内存和保留内存中的内容