C++ STL 队列pop判为空后,为什么队尾元素仍然存在?

「已注销」 2020-02-04 12:27:10
弄不明白队尾元素为什么还存在,刚学习STL,请各位大佬赐教

他既然存在,那么存储于哪呢?
#include <queue>
#include <bits/stdc++.h>
#include <windows.h>
using namespace std;
int main()
{
queue<int> q;
for (int i = 0; i < 5; i++){
q.push(i);
cout<< q.back() << endl;
}
cout <<"The size is "<< q.size() << endl;

for (int i = 0; i < 5; i++){
cout <<"head "<< q.front();
q.pop();
cout << " tail " << q.back() << endl;
}
cout<<"******"<<endl;
if(q.empty())
cout<<"Empty"<<endl;
q.pop();
cout << "tail "<< q.back() << endl;
system("pause");
/*
根据运行结果,队列q的队尾仍然是4
但是q的长度却为0,而且q不存在队首元素
*/
}
...全文
939 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
Rotch 2021-05-04
  • 打赏
  • 举报
回复
引用 6 楼 寻开心 的回复:
就好比字符数组当字符串用一样 你把第一个元素设置为0, 字符串是空的了, 但是数组里面还有元素,你要访问里面的元素依然还是可以 但是这不代表是正常的用法 queue实现是要考虑效率的问题的, 它并不是没有了数据就立刻释放内存,要为后面可能的继续push等操作保留原有分配的内存 back,front都是返回的模版类型的引用, 它对应的内存还在, 因此还是可以访问 但是同样也不代表这是正常的用法
不完全对,这里不是把所有元素变成0,而是直接把自己底层的 size 赋值为 0.内存还在
真相重于对错 2020-02-04
  • 打赏
  • 举报
回复
你的代码有逻辑问题 for (int i = 0; i < 5; i++){ cout <<"head "<< q.front(); q.pop(); cout << " tail " << q.back() << endl; } 这段运行中修改了q本身,会出错。
一星伴月 2020-02-04
  • 打赏
  • 举报
回复
这个肯定是存在的呀,分配过的内存即使pop也不会释放。除非是queue析构才会释放全部内存。所以元素还是存在分配过的内存中的,back返回的是最后一个内存中的元素这个和pop没有啥关系,你可以再输出一下front你会发现他是0(你的数据可以换一下,比如从1开始,不然看不出来),表示没有元素
taodm 2020-02-04
  • 打赏
  • 举报
回复
stl说了:信任程序员知道自己在做什么。
「已注销」 2020-02-04
  • 打赏
  • 举报
回复
引用 14 楼 真相重于对错的回复:
[quote=引用 13 楼 VanderStar 的回复:] [quote=引用 12 楼 真相重于对错 的回复:] 因为当你执行i=4时 for (int i = 0; i < 5; i++){ cout <<"head "<< q.front(); //这时输出4 q.pop();//pop完了以后q的size将为0 cout << " tail " << q.back() << endl;//再输出则出将出错,因为q里面没有元素了 } 如果你的结果不出错的话,你的编译器太旧了,该换了。
调用front 确实出错,而且我也试过empty和size,结果均显示队列为空,但是使用back,仍然可以得到之前的队尾元素,详细解释请看六楼[/quote] 所以说你的编译器太旧了 [/quote] 谢谢,我用的MinGW😂😂😂,不太懂编译器这块
真相重于对错 2020-02-04
  • 打赏
  • 举报
回复
引用 13 楼 VanderStar 的回复:
[quote=引用 12 楼 真相重于对错 的回复:] 因为当你执行i=4时 for (int i = 0; i < 5; i++){ cout <<"head "<< q.front(); //这时输出4 q.pop();//pop完了以后q的size将为0 cout << " tail " << q.back() << endl;//再输出则出将出错,因为q里面没有元素了 } 如果你的结果不出错的话,你的编译器太旧了,该换了。
调用front 确实出错,而且我也试过empty和size,结果均显示队列为空,但是使用back,仍然可以得到之前的队尾元素,详细解释请看六楼[/quote] 所以说你的编译器太旧了
「已注销」 2020-02-04
  • 打赏
  • 举报
回复
引用 12 楼 真相重于对错 的回复:
因为当你执行i=4时 for (int i = 0; i < 5; i++){ cout <<"head "<< q.front(); //这时输出4 q.pop();//pop完了以后q的size将为0 cout << " tail " << q.back() << endl;//再输出则出将出错,因为q里面没有元素了 } 如果你的结果不出错的话,你的编译器太旧了,该换了。
调用front 确实出错,而且我也试过empty和size,结果均显示队列为空,但是使用back,仍然可以得到之前的队尾元素,详细解释请看六楼
真相重于对错 2020-02-04
  • 打赏
  • 举报
回复
因为当你执行i=4时 for (int i = 0; i < 5; i++){ cout <<"head "<< q.front(); //这时输出4 q.pop();//pop完了以后q的size将为0 cout << " tail " << q.back() << endl;//再输出则出将出错,因为q里面没有元素了 } 如果你的结果不出错的话,你的编译器太旧了,该换了。
「已注销」 2020-02-04
  • 打赏
  • 举报
回复
引用 10 楼 真相重于对错的回复:
[quote=引用 5 楼 VanderStar 的回复:] [quote=引用 3 楼 真相重于对错的回复:]你的代码有逻辑问题 for (int i = 0; i < 5; i++){ cout <<"head "<< q.front(); q.pop(); cout << " tail " << q.back() << endl; } 这段运行中修改了q本身,会出错。
我这段的意思是想让队首出队看他有什么变化,没想太多[/quote] 你想从出错的代码看出正确的结果?[/quote] 这段代码pop队首元素,我之后输出的是队尾元素,请问这怎么影响输出结果了?
真相重于对错 2020-02-04
  • 打赏
  • 举报
回复
引用 5 楼 VanderStar 的回复:
[quote=引用 3 楼 真相重于对错的回复:]你的代码有逻辑问题 for (int i = 0; i < 5; i++){ cout <<"head "<< q.front(); q.pop(); cout << " tail " << q.back() << endl; } 这段运行中修改了q本身,会出错。
我这段的意思是想让队首出队看他有什么变化,没想太多[/quote] 你想从出错的代码看出正确的结果?
「已注销」 2020-02-04
  • 打赏
  • 举报
回复
引用 6 楼 寻开心的回复:
就好比字符数组当字符串用一样
你把第一个元素设置为0, 字符串是空的了, 但是数组里面还有元素,你要访问里面的元素依然还是可以
但是这不代表是正常的用法

queue实现是要考虑效率的问题的, 它并不是没有了数据就立刻释放内存,要为后面可能的继续push等操作保留原有分配的内存
back,front都是返回的模版类型的引用, 它对应的内存还在, 因此还是可以访问
但是同样也不代表这是正常的用法
懂了,谢谢大佬!
一星伴月 2020-02-04
  • 打赏
  • 举报
回复
引用 4 楼 VanderStar 的回复:
[quote=引用 2 楼 初学小菜的回复:]这个肯定是存在的呀,分配过的内存即使pop也不会释放。除非是queue析构才会释放全部内存。所以元素还是存在分配过的内存中的,back返回的是最后一个内存中的元素这个和pop没有啥关系,你可以再输出一下front你会发现他是0(你的数据可以换一下,比如从1开始,不然看不出来),表示没有元素
我输出的front是-xxxxxx,这是乱码[/quote]队首没东西肯定会输出乱码,或则0
一星伴月 2020-02-04
  • 打赏
  • 举报
回复
引用 4 楼 VanderStar 的回复:
[quote=引用 2 楼 初学小菜的回复:]这个肯定是存在的呀,分配过的内存即使pop也不会释放。除非是queue析构才会释放全部内存。所以元素还是存在分配过的内存中的,back返回的是最后一个内存中的元素这个和pop没有啥关系,你可以再输出一下front你会发现他是0(你的数据可以换一下,比如从1开始,不然看不出来),表示没有元素
我输出的front是-xxxxxx,这是乱码[/quote]这个取决于编译器的,有的会赋初值0,有的不会输出就是乱码
寻开心 2020-02-04
  • 打赏
  • 举报
回复
就好比字符数组当字符串用一样
你把第一个元素设置为0, 字符串是空的了, 但是数组里面还有元素,你要访问里面的元素依然还是可以
但是这不代表是正常的用法

queue实现是要考虑效率的问题的, 它并不是没有了数据就立刻释放内存,要为后面可能的继续push等操作保留原有分配的内存
back,front都是返回的模版类型的引用, 它对应的内存还在, 因此还是可以访问
但是同样也不代表这是正常的用法
「已注销」 2020-02-04
  • 打赏
  • 举报
回复
引用 3 楼 真相重于对错的回复:
你的代码有逻辑问题 for (int i = 0; i < 5; i++){ cout <<"head "<< q.front(); q.pop(); cout << " tail " << q.back() << endl; } 这段运行中修改了q本身,会出错。
我这段的意思是想让队首出队看他有什么变化,没想太多
「已注销」 2020-02-04
  • 打赏
  • 举报
回复
引用 2 楼 初学小菜的回复:
这个肯定是存在的呀,分配过的内存即使pop也不会释放。除非是queue析构才会释放全部内存。所以元素还是存在分配过的内存中的,back返回的是最后一个内存中的元素这个和pop没有啥关系,你可以再输出一下front你会发现他是0(你的数据可以换一下,比如从1开始,不然看不出来),表示没有元素
我输出的front是-xxxxxx,这是乱码

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧