我看了这篇文章,上面说deque在顶部和底部提供了有效的插入。然而,这篇文章指出,deque的时间复杂度是O(n)。我认为,如果一个deque有有效的顶部和底部插入,它将有O(1),而一个向量应该只有O(1)底部插入。如果有人能澄清一下,我将不胜感激
c++ 98,第23.2.1节(模板类deque)
"A deque…支持固定时间的开始或结束插入和擦除操作;中间的插入和擦除需要线性时间。也就是说,deque特别针对在开始和结束时推入和弹出元素进行了优化。与vector一样,存储管理是自动处理的。"
所以是的:0(1)插入在两端
来自c++标准:
23.3.3.4 deque modifiers [deque.modifiers]
[...]
void push_front(const T& x);
void push_front(T&& x);
void push_back(const T& x);
void push_back(T&& x);
[…]复杂度:复杂度与插入元素的数量加上到队列开始和结束的距离的小者成线性关系。在deque的开头或结尾插入单个元素总是花费常量时间,并导致对t的构造函数进行一次调用。
强调我的
std::deque的cppreference项给出了如下复杂度:
队列上常见操作的复杂度(效率)如下:
- 随机访问-常数O(1)
- 在末尾或开头插入或删除元素-平摊常数O(1)
- 插入或删除元素-线性O(n)
与c++标准草案23.3.3.1
类模板队列概述一致,其中说(强调我的):
deque是一个序列容器,与vector(23.3.6)一样,它支持随机访问迭代器。此外,它支持在开始或结束时进行恒定时间的插入和擦除操作;中间的插入和擦除需要线性时间。也就是说, deque特别针对开头和结尾的推入和弹出元素进行了优化。与vector一样,存储管理是自动处理的。
For std::vector cppreference表示:
对向量进行常见操作的复杂度(效率)如下:
- 随机访问-常数O(1)
- 末端元素的插入或移除-平摊常数O(1)
- 插入或移除元素-与向量O(n)末端的距离呈线性
与标准草案23.3.6.1
章节一致类模板矢量概述:
vector是支持随机访问迭代器的序列容器。此外,它支持(平摊)常数时间的末端插入和擦除操作,中间的插入和擦除操作需要线性时间。存储管理是自动处理的,尽管可以给出提示以提高效率。[…]