当涉及到一个序列时,"vector[n].push_back()"总是O(1)吗?

When it comes to a sequence, is "vector[n].push_back()" is always O(1)?

本文关键字:push back 总是 一个 vector      更新时间:2023-10-16

我用了很多vector<int> v[N]
这对我来说是一个非常强大的工具。

我想知道v[n].push_back()平均成本为O(1(。
我知道当向量充满时,它需要扩展到双倍。
但是向量序列不是相互依附的吗?
如果是这样,我认为所有向量都需要向左移动,这意味着它的成本高于 O(n(。

综上所述,当涉及到向量序列时,v[n].push_back()总是O(1(吗?
请给我一些帮助:D

无论如何,它并不总是 O(1(。看这里(强调我的(:

复杂性

常量(摊销时间,可能会发生重新分配(。

如果发生重新分配,则重新分配本身取决于线性 整个大小。

因此,即使只有一个向量,也不能保证它是恒定的。

但是向量的序列不是相互依附的吗?如果是这样,我认为 所有向量都需要移位,这意味着它的成本高于 O(1(。

这不会影响运行时。阵列中的向量彼此独立,并动态管理自己的存储(并且彼此分离(。数组中的实际矢量对象始终具有相同的大小。修改数组中的对象时,它不会更改对象的大小并移动数组的其余部分。

如果是这样,我认为所有向量都需要向左移动,这意味着它的成本高于 O(n(。

不,事实并非如此。

std::vector动态地为数组分配内存以将元素放入其中,并且仅存储指向该数组的指针(以及大小和容量(。sizeof(std::vector<T>)是一个编译时常量。将元素添加到向量时,c 数组内std::vector占用的内存量不会改变。

因此,将向量放置在数组中不会影响push_back的复杂性。