当涉及到一个序列时,"vector[n].push_back()"总是O(1)吗?
When it comes to a sequence, is "vector[n].push_back()" is always O(1)?
我用了很多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
的复杂性。
相关文章:
- 推导 std::vector::back() 的返回类型
- vector.back() 和 vector[vector.size() - 1] 之间的区别?
- vector.push_back(vector.back()+1) 是未定义的行为吗?
- C++自己的对象堆栈.在 push() 上复制了什么?
- C++ push() 和 pop() 方法使用指针的动态 LinkedList 的问题
- 如何像在javascript中一样"push" c ++映射
- 线路抑制状态错误 C4703 可能未初始化的局部指针变量"back"已使用
- std::vector using back(), pop_back(), push_back(), 得到'double free or corruption'错误
- vector.back()和vector.end()有什么区别
- 列表大小为 1,但 front() 和 back() 不相等
- 返回C++中没有 back() 方法的容器的最后一个元素?
- 在非空 std::list 上使用 std::list.back<int>() 时"Segmentation Fault"
- 模板堆栈类的复制构造函数中的 pop() 和 push() 不起作用
- 我们可以使用Back() - 值索引在其上执行向量插入
- 当我运行以下代码添加str.front() str.back时,它给了我200个,但为什么
- push(ing)back在循环中对象指针
- 在 C++ 中将元素添加到空向量:为什么 push.back 有效而 [] 无效
- 我似乎无法让 v.push.back() 处理字符串
- String::push_back() does not push back
- 向量resize(), push.back(), reserve()方法