ホームページ >バックエンド開発 >C++ >C で異なるコンテナのイテレータを比較することは有効ですか?

C で異なるコンテナのイテレータを比較することは有効ですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-02 09:02:291064ブラウズ

Is It Valid to Compare Iterators from Different Containers in C  ?

異なるコンテナーのイテレーターの比較

コンテナーを使用する場合、異なるコンテナーのイテレーターを比較することの影響を理解することが不可欠です。疑問が生じます: 異なるコンテナに属するイテレータを比較することは許されますか?

次のコードを考えてください:

<code class="cpp">std::vector<int> foo;
std::vector<int> bar;
std::cout << (foo.begin() == bar.begin());</code>

式 foo.begin() == bar.begin() は成立しますか? false を返すか、未定義の動作につながるか?

C 11 標準 (n3337) を詳しく調べると、次のジレンマが明らかになります:

同じシーケンス内の反復子

  • セクション 24.2.1 では、i を j と等しくする i 操作の有限シーケンスが存在する場合、2 つの反復子 i と j は到達可能であるとみなされると述べています。
  • If j is getable from i

異なるコンテナのイテレータの比較

  • ForwardIterators (RandomAccessIterators を含む) は、セクション 24.2 の対象となります。 5.
  • このセクションでは、== は同じ基礎となるシーケンス上の反復子を比較する場合にのみ使用できることを指定します。

これらの要件を考慮すると、異なるコンテナーの反復子を比較することは未定義の動作です。

LWG Issue #446

LWG Issue #446 はこの問題に明示的に対処し、標準への次の追加を提案しています:

「直接または1 つの共通範囲の部分範囲ではない 2 つの異なる範囲 r1 および r2 [...] から取得された 2 つの反復子の値を引数として持つ比較関数または二項演算子を間接的に評価することは、特に明示的に記述されていない限り、未定義です。"

結論として、異なるコンテナからのイテレータの比較は未定義の動作であり、カスタム イテレータを作成し、コード内でコンテナを操作する場合は、この制約に従うことが重要です。

以上がC で異なるコンテナのイテレータを比較することは有効ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。