認識 Iterator

普通

簡介

在 C++ 的 STL 中,iterator 是一個類似指標的物件,通常會指向容器中的某個元素。透過 iterator 我們可以方便地存取容器中的元素,並且根據容器的不同,iterator 也有稍微不同的操作方式。

這個章節將會簡單介紹 iterator 的基本操作,你會在未來的學習中遇到更多的 iterator 應用,並且通常需要搭配後面的章節才能更好地理解與使用,所以如果你對 iterator 還不太熟悉的話,不用擔心,繼續往接下來的章節讀你就會慢慢掌握了!

常見操作

即便 iterator 的操作方式因容器而異,但有一些操作是大部分容器都會支援的。接下來我們會介紹一些常見的操作。

取值

* 運算子可以取得 iterator 指向的元素。

cout << *it << endl;

往前 / 往後

++ 運算子可以將 iterator 往後移動一個位置,而 -- 運算子可以將 iterator 往前移動一個位置。

it++; // 往後移動
it--; // 往前移動

也可以使用 next()prev() 函式。

it = next(it); // 往後移動
it = prev(it); // 往前移動

部分容器也支援直接指定移動的步數。

it += 2; // 往後移動兩個位置
it -= 3; // 往前移動三個位置

it + 2; // 代表往後移動兩個位置的 iterator,但不會改變原本的 iterator
it - 3; // 代表往前移動三個位置 iterator,但不會改變原本的 iterator

有些容器還支援透過相減兩個 iterator 來取得兩者之間的距離。

int distance = it2 - it1; // it2 比 it1 往後移動了 distance 個位置

比較

==!= 運算子可以用來比較兩個 iterator 是否指向同一個元素。


if (it1 == it2) {
    cout << "it1 and it2 are pointing to the same element" << endl;
}

結語

也許你會疑惑,為什麼 iterator 會放在這個陣列單元呢?當然,iterator 並不是陣列的一部分,不過在操作陣列時,我們會用到 iterator 於是這邊就先簡單介紹了一些基本操作。

小測驗

以下哪個可以正確的取得 Iterator 指向的值?