std::queue
类不清楚size
成员函数的复杂性。它似乎基于当时使用的数据结构实现。
一个人假设 size
将O(C)
,但它完全可能是O(N)
。显然,我可以保持自己的体型,但我宁愿打电话给size
。
(问题已修改):由于deque
是默认容器,因此std :: deque :: size()的O()是什么?
答案 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)
总结一下这里非常好的答案:
O(1)
( @Jeffrey )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(); }
其中c
是protected
数据成员,其类型是第二个模板参数的类型。 Ergo ,其复杂性正是所述模板参数的size
成员函数的复杂性。默认值为std::deque<T>
- 其中T
是传递给std::queue
的第一个模板参数 - 除非另有说明,否则具有所有容器通用的默认O(1)复杂性要求(根据表96 in 23.2.1)。