C での異なるコンテナーのイテレーターの比較は動作を定義していますか?

Linda Hamilton
リリース: 2024-11-03 06:03:30
オリジナル
693 人が閲覧しました

Is Comparing Iterators from Different Containers in C   Defined Behavior?

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

カスタム イテレータ実装のコンテキストでは、イテレータの比較は許可されるのかという基本的な疑問が生じます。別のコンテナから?たとえば、次のコード スニペットを考えてみましょう:

<code class="cpp">std::vector<int> foo;
std::vector<int> bar;

// Is this expression valid?
foo.begin() == bar.begin();</code>
ログイン後にコピー

C 11 標準による:

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

  • インクリメント演算子 ( ) を繰り返し適用した結果が等しくなる場合、反復子は相互に到達可能であるとみなされます。
  • 反復子は、相互に到達可能であれば、同じシーケンスの要素を参照します。

異なるコンテナからの反復子の比較:

  • 前方反復子の場合、反復子の比較は、それらが同じ基礎となるシーケンスに属している場合にのみ定義されます。

したがって、上記の例の foo.begin() と bar.begin() など、異なるコンテナの反復子を比較することは、未定義の動作とみなされます。

この未定義の動作これは、イテレータがコンテナ内の特定の要素を参照するという事実に由来します。イテレータが異なるコンテナに属している場合、それらは同じ基礎となるシーケンス内の要素を指していると想定できません。そのため、それらの比較では未定義の結果が生じます。

LWG Issue #446:

この問題を明確にするために、LWG 問題 #446 は、次のテキストを標準に追加することを提案しました:

任意の比較関数または 2 つの反復子の値を引数として取得した二項演算子を直接的または間接的に評価した結果。 2 つの異なる範囲... は、特に明記されていない限り、未定義です。

この追加により、別個のコンテナからの反復子を比較するという未定義の性質がさらに強調されます。

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

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