首页  >  文章  >  后端开发  >  现代 C 实现中的 std::list::size() 真的是 O(1) 吗?

现代 C 实现中的 std::list::size() 真的是 O(1) 吗?

Linda Hamilton
Linda Hamilton原创
2024-11-16 10:57:03924浏览

Is `std::list::size()` Truly O(1) in Modern C   Implementations?

std::list::size() 在现代实现中真的是 O(n) 吗?

最近,一些开发人员建议std::list::size() 具有线性时间复杂度 (O(n))。但是,根据 C 标准,复杂性没有定义,并且可能会因实现而异。

在 C 标准的早期版本(C 03)中,建议 size() 操作具有恒定的复杂性(O(1))。然而,随着 C 11 的引入,它成为所有标准容器的要求。 C 11 标准的表 96 明确指出 .size() 对于所有容器应该具有恒定的复杂性。

历史上,GCC 的 libstdc 库使用 std::distance(begin ) 实现复杂度为 O(n) 的 size() (), end()),如您引用的博客文章中所述。然而,在 C 11 模式中,这种行为发生了变化:

size_type
size() const _GLIBCXX_NOEXCEPT
{ return __size_alloc_.first(); }

_LIBCPP_INLINE_VISIBILITY
const size_type& __sz() const _NOEXCEPT
    {return __size_alloc_.first();}

在 GCC 5.0 及更高版本中,size() 函数使用内部数据结构来跟踪元素的数量,有效地使操作O(1)。这符合所有标准容器的 C 11 要求。

需要注意的是,一些利基用例可能仍然会导致 size() 的 O(n) 复杂性,但对于绝大多数用户来说,操作应该是恒定的时间。

以上是现代 C 实现中的 std::list::size() 真的是 O(1) 吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn