什么是std :: queue :: size的Big O()顺序?

时间:2014-02-11 21:58:04

标签: c++ data-structures queue big-o

std::queue类不清楚size成员函数的复杂性。它似乎基于当时使用的数据结构实现。

一个人假设 sizeO(C),但它完全可能是O(N)。显然,我可以保持自己的体型,但我宁愿打电话给size

(问题已修改):由于deque是默认容器,因此std :: deque :: size()的O()是什么?

5 个答案:

答案 0 :(得分:8)

至少自C ++ 11以来,std::queue::size is constant:O(1)的复杂性。

根据§23.6.3.1/ 1,std::queue的基础容器必须符合SequenceContainer的要求,这继承了{{3}的要求,这保证了这一点。反过来,根据§23.2.1,要求成员函数size具有恒定的时间复杂度。

答案 1 :(得分:2)

总结一下这里非常好的答案:

  • C ++ 11:O(1) @Jeffrey
  • C ++ 98:未加强,需要根据容器类进行实验
  • C ++ 98 with default container:std :: queue的默认容器 是std :: deque,它通过减去两个来计算大小 迭代器, O(1),但至少O(C)。 (的 @juanchopanza

因此,如果你需要在C ++ 98中确保大小()的O(1) - ,你必须保持自己的计数。

如果可能的话,我想踩上我的肥皂盒,感谢C ++ 11小组关闭这个可怕的规格漏洞。许多语言/库(例如Scala)都非常努力地定义运算符的BIG-O。鉴于C ++的主要用例是性能,我发现这种缺乏规范令人惊讶。完全不可接受的是,我们必须检查标头代码以确定 std 类的性能特征。

答案 2 :(得分:0)

复杂性是常数O(1)。

常量(在底层容器上调用大小)。 http://www.cplusplus.com/reference/queue/queue/size/

答案 3 :(得分:0)

这可能取决于您使用的实施方式,最好自行检查。希望检查头文件并不难。尽管新标准要求它应该保持不变,但这是确定的唯一方法。值得注意的一个例子是,gcc的libstdc ++仍然有std::list的O(n)。

答案 4 :(得分:0)

std::queue::size完全在C ++ 11 23.6.3.1/1中指定:

size_type size() const { return c.size(); }

其中cprotected数据成员,其类型是第二个模板参数的类型。 Ergo ,其复杂性正是所述模板参数的size成员函数的复杂性。默认值为std::deque<T> - 其中T是传递给std::queue的第一个模板参数 - 除非另有说明,否则具有所有容器通用的默认O(1)复杂性要求(根据表96 in 23.2.1)。