迭代器
迭代器是一種物件,可逐一查看「C++ 標準程式庫」容器中的元素,並提供個別元素的存取途徑。 「C++ 標準程式庫」容器都有提供迭代器,因此演算法能以標準方式存取其元素,而不需要考慮元素儲存所在容器的類型。
您可以使用反覆運算器,明確地使用成員和全域函式,例如 begin()
和和運算元++
,例如和 --
來往前或end()
向後移動。 您也可以隱含使用反覆運算器搭配範圍 for 迴圈,或 (針對某些反覆運算器類型)下標運算子 []
。
在「C++ 標準程式庫」中,序列或範圍的開頭是第一個元素。 序列或範圍的結尾一律定義為最後一個元素之後的元素。 全域函式 begin
,並將 end
反覆運算器傳回指定的容器。 一般明確迭代器會以迴圈方式處理容器中的所有元素,如下所示:
vector<int> vec{ 0,1,2,3,4 };
for (auto it = begin(vec); it != end(vec); it++)
{
// Access element using dereference operator
cout << *it << " ";
}
使用 range-for 迴圈:
for (auto num : vec)
{
// no dereference operator
cout << num << " ";
}
迭代器有五種分類。 為了增加能力,在這裡將分類為:
輸出。 輸出反覆運算器
X
可以使用 運算符逐一查看序列++
,而且只能使用*
運算符寫入元素一次。輸入。 輸入反覆運算器
X
可以使用 運算符逐一查看序列++
,而且可以使用 運算符多次讀取元素*
。 您可以使用和!=
運算符來比較輸入反覆運算器==
。 在您遞增輸入反覆運算器的任何復本之後,就無法安全地比較、取值或遞增其他複本。轉寄。 正向反覆運算器
X
可以使用 ++ 運算子逐一查看序列,而且可以使用 運算符讀取任何元素或寫入非 const 元素。*
您可以使用運算符來存取元素成員->
,並使用 和!=
運算符來比較正向反覆運算器==
。 您可以建立正向迭代器的多個複本,每個都可以取值 (Dereference),而且獨立遞增。 在未參考任何容器的情況下初始化的正向反覆運算器,稱為 Null 轉寄反覆運算器。 Null 正向迭代器一律會以相等方式比較。雙向。 雙向反覆運算器可以取代正向反覆運算器
X
。 不過,您也可以遞減雙向反覆運算器,如 、X--
或(V = *X--)
。--X
您可以使用與正向迭代器相同的方式來存取元素成員,以及比較雙向迭代器。隨機存取。 隨機存取反覆運算器
X
可以取代雙向反覆運算器。 透過隨機存取反覆運算器,您可以使用下標運算符[]
來存取元素。 您可以使用+
、-
+=
和-=
運算符來向前或向後移動指定的項目數目,並計算反覆運算器之間的距離。 您可以使用、、!=
、<
、>
、<=
和>=
來比較雙向反覆運算器==
。
所有迭代器可以指派或複製。 它們假設為輕量型物件,而且通常會以傳值方式傳遞和傳回,而不是以傳址方式傳回。 另請注意,當在有效的迭代器上執行時,上述的作業均無法擲回例外狀況。
可以藉由顯示三個序列來摘要迭代器分類的階層。 對於序列的唯寫存取,您可以使用任一項:
輸出反覆運算器
-> 轉寄反覆運算器
-> 雙向反覆運算器
-> 隨機存取反覆運算器
向右箭號表示「可以取代」。例如,呼叫輸出反覆運算器的任何演算法都應該與正向反覆運算器搭配運作良好,但 不是 另一種方式。
對於序列的唯讀存取,您可以使用任一項:
輸入反覆運算器
-> 轉寄反覆運算器
-> 雙向反覆運算器
-> 隨機存取反覆運算器
在此案例中,輸入迭代器是所有分類中最薄弱的。
最後,對於序列的讀取/寫入存取,您可以使用任一項:
forward iterator
-> 雙向反覆運算器
-> 隨機存取反覆運算器
物件指標一律可以當做隨機存取迭代器,所以如果它對於指定的序列支援讀取/寫入存取,則可以做為任何分類的迭代器。
物件指標以外的迭代器 Iterator
也必須定義特製化 iterator_traits<Iterator>
所需的成員類型。 這些需求可以藉由衍生 Iterator
自公用基類 反覆運算器來符合。
請務必瞭解每個反覆運算器類別的承諾和限制,以瞭解C++標準連結庫中容器和演算法如何使用反覆運算器。
注意
您可以透過使用 range-for 迴圈來避免使用迭代器。 如需詳細資訊,請參閱 以範圍為基礎的 for 語句。
Microsoft C++現在提供已檢查的反覆運算器和偵錯反覆運算器,以確保您不會覆寫容器的界限。 如需詳細資訊,請參閱已檢查的迭代器和偵錯迭代器支援。