为什么不通过将指针移到vector[0]来实现c++std::vector::pop_front()呢
why not implement c++ std::vector::pop_front() by shifting the pointer to vector[0]?
为什么不能通过简单地将矢量名称中包含的指针移动一点来为C++矢量实现pop_front()
?因此,在包含数组foo
的向量中,foo
是指向foo[0]
的指针,因此pop_front()
将使指针成为foo = foo[1]
,而括号运算符将只进行正常的指针数学运算。这与C++如何跟踪您在为数组分配空间时使用的内存有关吗?
我承认,这与我看到的关于为什么std::vector
没有pop_front()
函数的其他问题类似,但我没有人问你为什么不能移动指针。
如果vector
这样做,它将无法释放内存。
通常,您希望每个vector
对象的开销较小。这意味着您只存储三项:指向第一个元素的指针、容量和长度。
为了实现您的建议,每个vector
(所有)都需要一个额外的成员变量:从第零个元素所在的开始指针的偏移量。否则,内存将无法释放,因为它的原始句柄将丢失。
这是一种权衡,但通常情况下,可能具有数百万个实例的对象的内存消耗比对vector
执行这是性能上最糟糕的事情的极端情况更有价值。
因为实现者希望优化向量的大小。它们通常使用3个指针,一个用于开头,一个表示容量(分配的末尾),一个代表末尾。
执行所需操作会向每个向量再添加4个字节(在c++程序中有很多这样的字节),但收效甚微:向量的契约是在推送新元素时快速,删除和插入是"未知"操作,它们的性能比类的大小更重要。
我开始输入一个详细的答案,解释如何分配和释放内存,但在输入完所有答案后,我意识到仅靠内存问题并不能证明为什么pop_front
没有像这里的其他答案所建议的那样存在。
在大多数情况下,在额外成本是另一个指针的向量中具有pop_front
是合理的。在我看来,问题在于push_front
。如果容器具有pop_front
,那么它也应该具有push_front
,否则容器不一致。push_front
对于矢量容器来说肯定是昂贵的(除非您将push
es与pop
s相匹配,这不是一个好的设计)。没有push_front
,如果在没有push_front
功能的情况下执行大量pop_front
操作,则向量实际上是浪费内存。
现在,pop_front
和push_front
需要一个类似于向量(恒定时间随机访问)的容器,这就是为什么存在deque
的原因。
您可以,但这会使实现稍微复杂一些,并添加一个指向类型大小的开销指针(这样它就可以跟踪实际分配的地址)。这值得吗?有时首先考虑其他可以更好地处理您的使用的结构(可能是deque?)。
您可以做到这一点,但vector
被设计成一个简单的容器,具有恒定的时间索引查找和从末尾推送/弹出功能。按照您的建议执行会使实现复杂化,因为它必须跟踪分配的起点和"当前"起点。更不用说,你仍然不能保证在前面持续插入时间,但有时你可能会得到它。
如果你需要一个前后插入和取出时间恒定的容器,这正是deque
的用途,不需要修改vector
来处理它。
您可以使用std::deque
而不是std::vector
。这是一个双端队列,也有类似向量的访问成员。它同时实现前推和后推/弹出。
http://www.cplusplus.com/reference/stl/deque/
您的建议的另一个缺点是,您将浪费内存空间,因为在移位后无法使用数组左侧的内存空间。执行pop_front()
的次数越多,在向量被破坏之前浪费的时间就越多。
- 为什么std::vector和std::valarray初始化构造函数不同
- 将用户定义的类型与 std::vector 和 std::sort 一起使用
- 传递 std::vector of std::shared_ptr,而不是更新对象
- 创建一个没有复制构造函数的类的 std::vector 的 std::vector
- Arduino编译器和STL:使用std::vector和std::map
- 为什么 std::vector 使用 std::分配器而不是运算符 new 和 delete?
- 错误:调用"es_queue::set_rpc_vector(std::vector >&, std::__cxx11::string)"没有匹配函数
- PyBind11:返回对 std::vector of std::unique_ptr 的常量引用
- What is std::vector::_emplace_back_slow_path / std::vector::
- 如何在 std::map 中从 std::vector of std::p air 中获取输入?
- Returning std::vector with std::move
- std::vector, std::move 和指针失效
- 带有 std::vector 和 std::queue 的 Prim's 算法,我的代码有什么问题?
- .at() 应该在 std::vector 或 std::array 中的 [] 上使用吗?
- 形成算法时未知的"vector"和"std"
- 对于关键字查找,std::vector比std::map快
- 这个std::vector和std::shared_ptr内存泄漏是一个bug吗
- 何时使用 Eigen::Vector vs std::vector
- 是否可以为带有 std:string 和 std::vector 的 std::map 重载<<运算符<int>?
- 使用std :: vector进行std ::数组初始化