`std::list::size()` は常に O(1) ですか?

Barbara Streisand
リリース: 2024-11-24 04:30:10
オリジナル
168 人が閲覧しました

Is `std::list::size()` Always O(1)?

Is list::size() 本当に O(1)?

かつては std::list::size が真でしたが() は実装間でさまざまな複雑さを示しましたが、C 11 ではその動作が標準化されています。コンテナ要件の表 96 では、すべての標準コンテナの .size() 操作に一定の複雑さ (O(1)) を義務付けています。

ただし、バージョン 5.0 より前の gcc の libstdc 実装には注目すべき例外が残っています。 C 11 標準要件にもかかわらず、その .size() 関数は、次の抜粋に示すように O(N) アルゴリズムを採用しています:

size_type
size() const _GLIBCXX_NOEXCEPT
{ return std::distance(begin(), end()); }
ログイン後にコピー

この決定は、 libstdc 内の最適化を考慮した結果です。リストを走査するのではなく要素の個別の数を維持すると、標準の複雑さの要件に反しますが、一部のユースケースではパフォーマンスが向上します。一方、

Libc の実装は O(1) に正しく準拠しています。次のコード スニペットで示されているように、複雑さは次のとおりです。

_LIBCPP_INLINE_VISIBILITY
size_type size() const _NOEXCEPT     {return base::__sz();}

...

__compressed_pair<size_type, __node_allocator> __size_alloc_;

_LIBCPP_INLINE_VISIBILITY
const size_type&amp; __sz() const _NOEXCEPT
    {return __size_alloc_.first();}
ログイン後にコピー

結論として、C 11 標準では、O(1) の複雑性が義務付けられています。 std::list::size()、バージョン 5.0 より前の gcc の libstdc 実装は依然として異常であり、代わりに O(N) アルゴリズムを採用しています。

以上が`std::list::size()` は常に O(1) ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート