当插入顶部时,deque是否提供O(1)复杂性

时间:2014-03-10 17:21:05

标签: c++ vector stl deque

我正在查看this帖子,并指出deque在顶部和底部提供了有效的内容。但是这里post表示除了后面的deque的时间复杂度是O(n)我认为如果一个双端队列具有有效的顶部和底部插入,它将具有O(1),而向量应该仅在底部插入时具有O(1)。如果有人能澄清这个,我将不胜感激

3 个答案:

答案 0 :(得分:4)

来自C ++标准:

  

23.3.3.4 deque modivers [deque.modirs]

[...]
void push_front(const T& x);
void push_front(T&& x);
void push_back(const T& x);
void push_back(T&& x);
  

[...]

     

3复杂性:复杂性是插入元素数量的线性加上去往双端队列开始和结束距离的较小者。 在双端队列的开头或末尾插入单个元素总是需要一个恒定的时间并导致对T的构造函数的单次调用。

强调我的

答案 1 :(得分:2)

C ++ 98,第23.2.1节(模板类deque)

“deque ...支持开始或结束时的恒定时间插入和擦除操作;在中间插入和擦除需要线性时间。也就是说,deque特别针对推送和弹出元素进行优化。开头和结束。与向量一样,存储管理会自动处理。“

是的:O(1)插入两端。

答案 2 :(得分:0)

std::deque的cppreference条目具有以下复杂性:

  

deques的常见操作的复杂性(效率)如下:

  • 随机访问 - 常数O(1)
  • 在结尾或开头插入或移除元素 - 摊销常数O(1)
  • 插入或移除元素 - 线性O(n)

draft C++ standard部分23.3.3.1 类模板deque概述一致(强调我的):

  

deque是一个序列容器,与vector(23.3.6)一样,支持随机访问迭代器。此外,它支持开始或结束时的恒定时间插入和擦除操作;在中间插入和擦除需要线性时间。也就是说, deque特别针对在开头和结尾推送和弹出元素进行了优化。与向量一样,存储管理也是自动处理的。

对于std::vector cppreference说:

  

向量上常见操作的复杂性(效率)如下:

  • 随机访问 - 常数O(1)
  • 在末尾插入或移除元素 - 摊销常数O(1)
  • 插入或移除元素 - 距离向量O(n)
  • 末端的线性距离

与标准草案部分23.3.6.1 类模板矢量概述一致:

  

vector是一个支持随机访问迭代器的序列容器。此外,它支持(分期)常量时间插入和擦除操作; 插入和擦除中间线性时间。存储管理是自动处理的,但可以提供提示以提高效率。[...]