38

我想做以下事情:

std::stack <int> s;
int h = 0;
s.push(2);
h = s.pop();

比如h保持值2。当我尝试我的方法时,我得到“空值没有被忽略”。

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

4

4 回答 4

51

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

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

(奇怪的是,您可能会注意到,对于并发容器, -likepop函数实际上被迫以原子方式删除并返回顶部值,因为在并发上下文中,没有“在顶部”(或“是空的”)。这是并发数据结构如何为提供保证而遭受重大性能损失的明显示例之一。)

于 2012-08-30T22:17:11.283 回答
6

您可以使用:

h = s.top();

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

 s.pop();

它的工作方式相同!

于 2013-03-19T13:19:42.050 回答
1

您实际上可以使用s.top()来存储元素,然后使用弹出它

s.pop().

采用

int h=s.top();
s.pop()

代替

int h=s.pop()

您不能直接分配s.pop()给某些数据类型,因为s.pop()从堆栈中删除元素并且不返回任何内容。

于 2018-07-10T12:36:50.203 回答
-5

S.pop()不返回任何值。因为pop()是void函数。如果您想查看堆栈的顶部,那么它将是S.top(). 如果您存储此值,则写入value = S.top().

于 2015-11-24T16:59:49.123 回答