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

时间:2011-12-12 02:13:21

标签: c++ stl g++ complexity-theory

我想大多数人都明白size()函数的复杂性并不能保证不变。虽然在某些实现中,它是恒定的。

G ++编译器可能是最常用的编译器。那么,在G ++的实现中,size()的复杂性是什么?如果它因不同的容器而异,那么哪些容器具有线性复杂性?对于最常用的(例如list,vector,deque,set和& map),它们是否都是常数?

3 个答案:

答案 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()); }

vectorsetdequemap是固定时间。 ,

这是std::deque

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

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

是常数