在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中实现吗?
编辑:
gcc 5改变了这一点:尽管付出了ABI改变的代价;这意味着用gcc 5.0编译的C++代码将不适用于旧版本的C++运行时库。
https://gcc.gnu.org/gcc-5/changes.html

最佳答案

在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是一件大事。它给客户带来很多痛苦。因此,它只会在相当长的一段时间内大张旗鼓地进行。

10-07 20:22
查看更多