比較不同容器中的迭代器:一個警示故事
在C 中,迭代器提供了一個強大的遍歷集合的機制。然而,在使用來自不同容器的迭代器時,重要的是要意識到這些限制。
比較不同容器的迭代器是否合法的問題經常出現。考慮以下範例:
<code class="cpp">std::vector<int> foo; std::vector<int> bar; std::cout << (foo.begin() == bar.begin());</code>
這個表達式乍看之下似乎無害,但它實際上會產生未定義的行為。根據 C 11 標準,迭代器只有引用相同序列的元素才能進行比較。由於 foo 和 bar 是兩個不同的向量,因此它們的迭代器不具有可比性。
LWG 問題#446 中進一步強調了這種行為:
「直接或間接評估任何比較函數或以兩個迭代器值作為參數的二元- 運算子是從兩個不同範圍r1 和r2 (...) 獲得的,這兩個範圍不是一個公共範圍的子範圍,除非另有明確說明,否則未定義。器具有重要意義。如果您打算為自訂迭代器實作運算子 ==,則必須確保它僅比較同一範圍內的迭代器。
不遵守此規則可能會導致意外行為,並最終產生有害影響到你的程式碼的可靠性。因此,重要的是要記住,在 C 中嚴格禁止比較來自不同容器的迭代器。
以上是你能比較 C 中不同容器的迭代器嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!