[英]size() complexity of STL containers in G++: which containers are O(n)?
我想大多数人都明白size()
函数的复杂性并不能保证不变。 虽然在某些实现中,它是恒定的。
G ++编译器可能是最常用的编译器。 那么,在G ++的实现中, size()
的复杂性是什么? 如果它因不同的容器而异,那么哪些容器具有线性复杂性? 对于最常用的(例如list,vector,deque,set和map),它们都是常量吗?
对于C ++ 11,标准(23.2.1)指定标准库的符合实现中所有容器的size
为O(1)(遗憾的是,这并不意味着所有实现都符合要求;例如gcc有此问题 ) 。
对于C ++ 03,标准(23.1)表示size
“应该具有持续的复杂性” ,事实证明(谢谢你,评论者)是一个强大但没有约束力的建议; 这意味着您必须阅读每个编译器提供的实现的文档。
它可能会根据标准库的版本而改变。
对于GCC最新版本(至少4.6.2) List
和基于List
的一个不是常量时间,而是实现为{ return std::distance(begin(), end()); }
{ 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
,它是常量。
对于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是常数
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.