我想大多数人都明白size()
函数的复杂性并不能保证不变。虽然在某些实现中,它是恒定的。
G ++编译器可能是最常用的编译器。那么,在G ++的实现中,size()
的复杂性是什么?如果它因不同的容器而异,那么哪些容器具有线性复杂性?对于最常用的(例如list,vector,deque,set和& map),它们是否都是常数?
答案 0 :(得分:16)
对于C ++ 11,标准(23.2.1)指定size
对于标准库的符合实现中的所有容器是O(1)(遗憾的是,这不是' t表示所有实现都符合要求;例如gcc has this issue)。
对于C ++ 03,标准(23.1)表示size
“应该具有恒定的复杂性”,因为事实证明(谢谢你,评论者)是一个强大的但是不具约束力的建议;这意味着您必须阅读每个编译器提供的实现的文档。
答案 1 :(得分:7)
它可能会根据标准库的版本而改变。
对于GCC最新版本(至少4.6.2)List
和基于List
的版本不是固定时间,而是实现为{ return std::distance(begin(), end()); }
。
MSVC标准库在更改时跟踪大小并仅返回其值(这使得splice()
O(n)因为它在拼接时必须计数。
来自我的/usr/include/c++/4.6.2/bits/stl_list.h
:
/** Returns the number of elements in the %list. */
size_type
size() const
{ return std::distance(begin(), end()); }
vector
,set
,deque
和map
是固定时间。 ,
这是std::deque
的
size_type
size() const
{ return this->_M_impl._M_finish - this->_M_impl._M_start; }
queue
和stack
实际上是容器适配器,并且依赖于可以指定的底层容器。但是默认值为deque
,这是常量。
答案 2 :(得分:0)
对于G ++ 5.4.0,文件/ usr / include / c ++ / 5.4.0 / bits / stl_list.h
/** Returns the number of elements in the %list. */
size_type
size() const _GLIBCXX_NOEXCEPT
{ return this->_M_node_count(); }
对于G ++ 4.8.5,文件/ usr / include / c ++ / 4.8.5 / bits / stl_list.h
/** Returns the number of elements in the %list. */
size_type
size() const _GLIBCXX_NOEXCEPT
{ return std::distance(begin(), end()); }
因此它对于4.8.5是线性的而对于5.4.0
是常数