将std :: stack .pop()方法的结果存储到变量中

Pin*_*ade 22 c++ stack

我想做以下事情:

std::stack <int> s;
int h = 0;
s.push(2);
h = s.pop();
Run Code Online (Sandbox Code Playgroud)

比如h保持价值2.当我尝试我的方法时,我得到"无效的价值,因为它应该是".

这不是.pop()方法的意图吗?这样做的首选方法是什么?

Ker*_* SB 37

标准库容器分开,top()并且pop():top()返回对top元素的引用,并pop()删除top元素.(同样适用于back()/ pop_back()等).

这种分离有一个很好的理由,并没有pop删除顶部元素并将其返回:C++的一个指导原则是你不需要支付你不需要的东西.单个函数别无选择,只能按值返回元素,这可能是不希望的.分离关注点为用户提供了如何使用数据结构的最大灵活性.(参见原始STL文档注释#3 .)

(作为一个好奇心,您可能会注意到,对于并发容器,类似pop函数实际上被强制删除并以原子方式返回顶值,因为在并发上下文中,没有"在顶部"(或"对于那个问题,这是空的.这是并发数据结构如何在提供保证方面受到重大性能影响的一个明显例子.)

  • 我想更加重视"pop()"返回一个值是个坏主意的立场.即使`pop()`有效地返回一个值,没有使用返回值的用户仍然需要付出代价:copy-constructor可能会抛出异常.我们甚至无法保证弹出未使用的值的简单行为会起作用!(显然忽略了抛出析构函数的可能性的失败.) (7认同)
  • 那么 pop 是一个用词不当。它不会通过算法从堆栈中弹出。抛开对行为的推理。 (4认同)
  • @BrianNeal,有多种方法可以设计“pop”,以便由复制构造函数引起的异常仍然使堆栈处于良好状态。至于为不需要的东西付费,可能有一种替代方法“remove”,可以删除顶部元素而不返回它。 (3认同)
  • 虽然这种设计是有效的,但它是短视的,因为1)删除和返回是基于堆栈的算法中的标准操作2)“弹出”的定义是“删除和返回”。制作一个返回的版本和一个不返回的版本会更有意义,不需要程序员每次都键入两个操作或每次都求助于宏或子类。 (3认同)

小智 5

您可以使用:

h = s.top();
Run Code Online (Sandbox Code Playgroud)

然后在使用之后(如果你想删除最新的值,否则什么都不做)

 s.pop();
Run Code Online (Sandbox Code Playgroud)

它的工作方式相同!!