首頁  >  文章  >  後端開發  >  比較 C 中不同容器的迭代器是否定義了行為?

比較 C 中不同容器的迭代器是否定義了行為?

Linda Hamilton
Linda Hamilton原創
2024-11-03 06:03:30696瀏覽

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 建議將以下文字加入標準:

直接或間接或間接評估任何比較函數或二元- 運算子的結果,其中兩個迭代器值作為從以下位置獲得的參數兩個不同的範圍...是未定義的,除非另有明確說明。

此添加進一步強調了比較來自不同容器的迭代器的未定義性質。

以上是比較 C 中不同容器的迭代器是否定義了行為?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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