为什么在GCC中std :: list O(n)的size()方法?

时间:2014-10-27 03:27:30

标签: c++ c++11 gcc size stdlist

在GCC中,std :: list的size()方法是O(n)。为什么呢?

对于C ++ 11,标准说size() of list should be O(1)

然而,在glibc中,我们有以下内容:

/usr/include/c++/4.6.3/bits/stl_list.h

template<typename _Tp, typename _Alloc = std::allocator<_Tp> >
class list : protected _List_base<_Tp, _Alloc>
{
 ...
 size_type
  size() const
  { return std::distance(begin(), end()); }

问题是:如何在海湾合作委员会中实施一项为期三年的要求?

编辑:

gcc 5改变了这一点:虽然以ABI变化为代价;这意味着使用gcc 5.0编译的C ++代码不适用于旧版本的C ++运行时库。

来自https://gcc.gnu.org/gcc-5/changes.html

  

默认启用std::list的新实现,使用O(1)size()函数

1 个答案:

答案 0 :(得分:8)

在C ++ 98/03中,没有说明std::list::size()是O(1)还是O(N)。两种决定都有权衡。

在C ++ 11中,委员会指定std::list::size()为O(1)。对于具有O(N)std::list::size()的实现,这是一个ABI突破性更改,而gcc就是这样的实现。打破ABI对于实现者来说是一件大事。它给客户带来了很多痛苦。因此,它只在很长一段时间内完成,并且相对大张旗鼓。