繁体   English   中英

size()G ++中STL容器的复杂性:哪些容器是O(n)?

[英]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()); }

vectorsetdequemap是恒定的时间。

这是std::deque

  size_type
  size() const
  { return this->_M_impl._M_finish - this->_M_impl._M_start; }

queuestack实际上是容器适配器,它依赖于可以指定的底层容器。 但是默认值是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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM