在許多關于迭代向量的例子中,我注意到經常使用不等于運算子來檢查回圈是否已經到達向量的末尾。通常,我在回圈條件中使用低于運算子。因此,我想知道,選擇背后的理由是!=什么?
例子:
std::vector<int> vec = {1, 2, 3, 4, 5};
for (auto iter = vec.begin(); iter != vec.end(); iter ) {
std::cout << *iter << " ";
}
uj5u.com熱心網友回復:
因為并非所有迭代器都支持排序,但所有迭代器都可以在 O(1) 中進行相等性比較。
例如關聯(有序)容器使用雙向迭代器,定義為(cppreference):
template<class I>
concept bidirectional_iterator =
std::forward_iterator<I> &&
std::derived_from</*ITER_CONCEPT*/<I>, std::bidirectional_iterator_tag> &&
requires(I i) {
{ --i } -> std::same_as<I&>;
{ i-- } -> std::same_as<I>;
};
std::forward_iterator只能取消參考、復制==、和遞增。
另一方面,std::vector需要使用的隨機訪問迭代器std::totally_ordered<I>。因此,在您的情況下,您可以撰寫iter < vec.end();,但代碼將變得不那么通用。只要您不增加回圈體??中的迭代器,無論如何您都是安全的。
uj5u.com熱心網友回復:
根據我的理解,
iterator在 STL 中有一個實作,它使您能夠“迭代”元素。使用它們,程式員不必撰寫邏輯來移動到下一個元素,這取決于它實作的資料結構。
也就是說,元素并不總是按順序存盤在記憶體中。因此,與索引相反,它們不能僅僅被比較為小于或大于。
對于向量,特別是您可以選擇在比較元素位置時使用索引。但與其他 DS 一樣不能自信地說。
因此,在您的問題中,迭代器的實作可以通過比較是否到達最后一個元素來跨越所有元素。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/339630.html
上一篇:檢查陣列中每個子項的出現頻率
