異なるコンテナーのイテレーターの比較: 注意事項
C では、イテレーターはコレクションを走査するための強力なメカニズムを提供します。ただし、異なるコンテナのイテレータを使用する場合は、制限事項に注意することが重要です。
異なるコンテナのイテレータを比較することが合法かどうかという問題が頻繁に発生します。次の例を考えてみましょう:
<code class="cpp">std::vector<int> foo; std::vector<int> bar; std::cout << (foo.begin() == bar.begin());</code>
この式は一見無害に見えるかもしれませんが、実際には未定義の動作を引き起こします。 C 11 標準によれば、反復子は同じシーケンスの要素を参照する場合にのみ比較できます。 foo と bar は 2 つの異なるベクトルであるため、それらのイテレータは比較できません。
この動作は、LWG 問題 #446 でさらに強調されています。
「任意の比較関数を直接または間接的に評価した結果、または1 つの共通範囲の部分範囲ではない 2 つの異なる範囲 r1 および r2 (...) から取得された 2 つの反復子の値を引数として持つバイナリ演算子は、特に明記されていない限り未定義です。"
この制限カスタム反復子の実装に重大な影響を及ぼします。カスタム反復子に演算子== を実装する場合は、同じ範囲内の反復子のみを比較するようにする必要があります。
このルールに従わないと、予期しない動作が発生する可能性があり、最終的には有害です。コードの信頼性が損なわれます。したがって、異なるコンテナの反復子を比較することは C では厳しく禁止されていることに留意することが重要です。
以上がC で異なるコンテナのイテレータを比較できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。