#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;
}
答案 0 :(得分:3)
在空容器上调用queue.pop()
会产生未定义的行为,因此在完成此操作后,您无法真正依赖任何有关程序的信息。
如果你调用了未定义的行为,那么你的队列可能会被损坏并且报告大小()为-1是正确/好/坏的。
答案 1 :(得分:2)
从空队列弹出是未定义的行为。
未定义的行为可以包括许多内容,例如格式化你的硬盘(不太可能!),让恶魔从你的鼻子出现(也不太可能)或有时完全符合你的预期(可能非常令人担忧)
您还使用%d
打印size_t,这只会导致麻烦。尝试在Visual Studio上使用%zu
(在gcc / clang上)或%Iu
答案 2 :(得分:2)
根据Unexpected behavior from STL's queue进行一些调整。
std :: queue是另一个容器周围的一个非常瘦的适配器(即包装器),您报告的行为实际上是std :: deque的行为,而不是std :: queue,因为您不更改默认容器。
在空序列上调用pop()是未定义的行为。