流行后,为什么空队列的大小减少了一个?

时间:2013-05-28 13:23:35

标签: c++ queue

#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;
}

3 个答案:

答案 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()未定义的行为。