#include <queue>
#include <stdio.h>
int main ()
{
std::queue<int> q;
printf("%d\n", q.size());
q.pop();
q.pop();
printf("%d\n", q.size()); // ===> prints -2
return 0;
}
问问题
844 次
3 回答
3
调用queue.pop()
空容器会产生未定义的行为,因此在完成此操作后,您将无法真正依赖程序的任何内容。
当您调用未定义的行为时,让您的队列可能损坏并报告 -1 的 size() 是正确的/好/坏的。
于 2013-05-28T13:27:30.437 回答
2
从空队列中弹出是未定义的行为。
未定义的行为可能包括许多事情,例如格式化您的硬盘驱动器(不太可能!),让恶魔从您的鼻子出现(也不太可能)或有时完全按照您的预期行事(可能而且非常令人担忧)
您还使用 size_t 打印%d
只会导致麻烦。尝试使用%zu
(在 gcc/clang%Iu
上)或 Visual Studio
于 2013-05-28T13:27:53.053 回答
2
根据STL 队列中的意外行为,稍作调整。
std::queue 是另一个容器周围的一个非常薄的适配器(即包装器),您报告的行为实际上是 std::deque 的行为,而不是 std::queue 的行为,因为您没有更改默认容器。
在空序列上调用 pop()是未定义的行为。
于 2013-05-28T13:28:28.440 回答