为什么 std::vector::p ush_front() 不存在?

Why doesn't std::vector::push_front() exist?

本文关键字:不存在 front ush std vector 为什么      更新时间:2023-10-16
既然std::vector::push_back()存在,为什么std::vector::push_front()不存在?

我知道还有其他存储对象的工作方式几乎相同,并且同时实现了push_back()push_front()函数,但我很好奇std::vector没有实现的原因。

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

这其中有一个重要原因:std::vector<>是一个连续的单端数组容器。它分配内存,并在分配区域的开头开始写入元素。它通常分配的内存超过了存储所有当前元素所需的内存,因此当您调用push_back((时,它会在末尾写入新元素,并递增其元素计数。它既快捷又高效。

另一方面,Push_front((需要以某种方式将新元素写在所有当前元素之前的[0]位置——然而,这并不是微不足道的,因为您的数组位置[0]已经被占用了。Push_front((将导致整个数组被重新复制,以便可以修改其前面。对于std::vector<>来说,这将是一种低效的操作类不是经过设计的。

当然,你仍然可以打电话给

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

但它会导致整个数组被复制,只是为了添加一个元素。