返回信息流#include<stack>
stack<int>stack1;
stack1.push(1);
int& i=stack1.top();
stack1.pop();
这个已经将栈中元素删除了,那么i这个引用还有效么?
这是一条镜像帖。来源:北邮人论坛 / cpp / #86259同步于 2015/4/1
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
关于栈的删除问题
guoxiangonly
2015/4/1镜像同步10 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
【 在 guoxiangonly 的大作中提到: 】
: #include<stack>
: stack<int>stack1;
: stack1.push(1);
: ...................
吓的我滚回去读了读C++11。
C++里所有的容器都储存object,这个object不是面向对象里面的“对象”的概念,它的意思是“数据储存的空间”。所以,每个C++容器里的每个元素都有一块储存空间(可以理解为内存)。
对于stack来说,top()获得栈顶元素的引用。既然是引用,就关联着这块空间。所以,你可以用返回的引用来修改栈顶的元素。
而pop()的语义就是“破坏”(destroy)那个栈顶元素的空间。这样,那个栈顶元素就不存在了。所以,只要调用了pop(),那个top()返回的引用就马上变成非法的了。
【 在 wangxiaobupt 的大作中提到: 】
: 有效 你可以看一下pop函数的实现
我本来也以为是有效的,等我吓得滚回去读了读C++11之后发现这也是“从什么都不发生到机器冒烟都可能”的情况。给个章节吧:
标准见: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf
container与object的关系:§23.2.1.1
stack的top()就是back()的意思,pop()就是pop_back()的意思。 §23.6.5.2 定义就在代码里面
back()和pop_back()的语义:§23.2.3 table101
谢谢暖神,我是在剑指offer60页,看到了用两个栈实现一个队列题中,有了这个疑问,那看来是书出错误了。
【 在 nuanyangyang 的大作中提到: 】
:
: 吓的我滚回去读了读C++11。
: C++里所有的容器都储存object,这个object不是面向对象里面的“对象”的概念,它的意思是“数据储存的空间”。所以,每个C++容器里的每个元素都有一块储存空间(可以理解为内存)。
: ...................
那还得去看deque的pop函数实现,反正别这么弄就对了
【 在 wangxiaobupt 的大作中提到: 】
: 有效 你可以看一下pop函数的实现