C++ 为什么';t std::vector::push_front()是否存在?

C++ 为什么';t std::vector::push_front()是否存在?,c++,vector,C++,Vector,既然存在std::vector::push_-back(),为什么不也存在std::vector::push_-front() 我知道还有其他一些存储对象的工作方式几乎相同,它们都实现了push_-back()和push_-front()函数,但我很好奇为什么std::vector不这样做。你永远都不想在向量上推前。将一个元素添加到前面意味着将向量中的每一个其他元素向后移动一个元素:O(n)复制。糟糕的性能。这有一个重要原因:std::vector是一个连续的单端数组容器。它分配内存并开始在分配

既然存在
std::vector::push_-back()
,为什么不也存在
std::vector::push_-front()


我知道还有其他一些存储对象的工作方式几乎相同,它们都实现了
push_-back()
push_-front()
函数,但我很好奇为什么
std::vector
不这样做。

你永远都不想在向量上推前。将一个元素添加到前面意味着将向量中的每一个其他元素向后移动一个元素:O(n)复制。糟糕的性能。

这有一个重要原因:std::vector是一个连续的单端数组容器。它分配内存并开始在分配区域的开头写入元素。它通常分配的内存多于存储所有当前元素所需的内存,因此当您调用push_back()时,它会在末尾写入新元素并增加其元素计数。它快速有效

另一方面,Push_front()需要以某种方式将新元素写入所有当前元素之前的位置[0]——然而,这并不简单,因为数组位置[0]已经被占用。Push_front()将导致重新复制整个数组,以便修改其前端。这将是一个低效的操作,std::vector类并不是为其设计的

当然,你还是可以打电话来

std::vector::insert(begin(), 1, val)

但是,只需添加一个元素,就可以复制整个数组。

vector::push\u front
无法有效实现;它将具有O(n)复杂性。它的缺失阻碍了低效率的使用。如果您真的需要它,那么如果您考虑到it@IgorTandetnik为什么要在评论部分回答?另一方面,
std::list::iterator::operator-(iterator)
不存在,但如果需要,可以使用
std::distance
解决这个问题。这是故意的;昂贵的方法应该脱颖而出,这是有道理的indeed@Tyker为什么?如果最后还有空间,你就不需要更多的存储空间了,你只需要把所有的东西移回一个位置。这应该只需要一个额外的构造来构造最后一个元素。@Tyker:No.
push_front
必须移动现有对象,但它可以通过向后循环将它们移动到位。@Tyker如果大小为5,容量为10,则将元素推到前面不会导致重新分配。唯一会发生的时间是当大小等于容量时,这与推送没有什么不同_back@NathanOliver这已经有很长一段时间了,但是为了他人的利益回应你的评论-请不要把它看作是个人的:你真的不想把所有的元素向前推进,即使你不需要重新分配。移动本身是非常昂贵的-O(N),正如这个响应者所提到的。如果你移动,它将以邪恶的方式使现有迭代器无效。在现代C++中,在<代码> STD::vector < /COD>中的元素通常是移动的(如果移动是<代码> NO/<代码> >,请移动它们,而不是复制它们。谢谢。我很感激你的解释。不,搬家指的是与这里发生的事情无关的另一种情况。不能通过“移动”其余元素将第一个元素添加到连续数组中;复制将以某种方式进行。那么,为什么存在
vector::insert()
函数呢?