首頁 >後端開發 >C++ >在 C 中比較來自不同容器的迭代器是否有效?

在 C 中比較來自不同容器的迭代器是否有效?

Barbara Streisand
Barbara Streisand原創
2024-11-02 09:02:291013瀏覽

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 操作的有限序列,則兩個迭代器i 和j 被認為是可達的。
  • 如果 j 從 i 可達,它們引用來自同一序列的元素。

比較不同容器的迭代器

  • ForwardIterators,其中包含 RandomAccessIterators,受第 24.2 節的約束。 5.
  • 本節指定 == 只能用於比較同一底層序列上的迭代器。

考慮到這些要求,比較來自不同容器的迭代器是未定義的行為。

LWG 問題#446

LWG 問題#446 明確解決了這個問題,建議對標準添加以下內容:

「直接或間接評估任何比較函數或二元- 運算符,以兩個迭代器值作為參數,這兩個迭代器值是從兩個不同範圍r1 和r2 [...] 獲得的,這兩個範圍不是一個公共範圍的子範圍,這是未定義的,除非另有明確說明。遵守此約束至關重要。

以上是在 C 中比較來自不同容器的迭代器是否有效?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn