当堆栈没有底层函数时,为什么C++标准队列有后退功能?

whi*_*kar 5 c++ queue stack std

在许多非官方的C++参考网站之一,列出了成员函数front()back()for std::queue.但是,std::stack只有top()功能.

堆栈没有bottom()函数是有意义的,因为这是堆栈的定义.

我没有得到的是为什么C++标准委员会选择不遵循队列的定义并为队列提供back()功能,并选择遵循堆栈的定义而不提供bottom()功能.

Ste*_*sop 7

可能还有其他原因back(),但是你需要它来为队列,因为C++ 03中的成语便宜地将一个"空"对象复制到一个容器中,然后swap使用一个"完整"对象来ping该新元素复制费用昂贵.由于移动语义,这个原因在C++ 11中或多或少已经过时,但当然back()仍需要兼容性.

您不需要bottom()为此(或任何其他)原因堆栈.

  • @whiteSkar示例:想一个向量队列.假设每个向量都有数千个或更多元素.要将`v`推到`q`,你可以做`q.push(v)`,但这会复制整个向量.相反,`q.push(vector <int>()); .q.back()交换(V);`.这只是交换指针,它实际上并没有触及任何矢量元素.如果在推送后没有使用`v`,那么这种方法要快得多. (2认同)
  • @BenVoigt 肯定是 C++11,但 Steve 谈论的是 C++03。 (2认同)