快轉到主要內容

Iterator 介紹

目錄

回顧vector
#

還記得 vector 嗎?當時我們介紹了 size()front()push_back() 等等的操作,然而,其實 vector 以及其他 STL 們還有一個神奇的東西可以用!那就是 iterator。以下為了方便講解 iterator的功能,會使用 vector 做舉例。

begin()end() 簡介
#

其實 iterator 有點像一根箭頭,指向的是容器的某個位置。以 vector 舉例,有兩個內建的迭代器叫做 begin()end(),就是分別指向第一個元素最後一個元素的後面 ( 這很容易記錯>< )。

舉個例子,假設你有一個裡面有東西的 vector,那麼你可以這樣做:

vector<int> v;
// 插入數字並由小到大排序後
cout << *v.begin();

其中,*有取值的意思,就是取v.begin()指到誰。這樣你就可以取得這些數字的最小值了。同理如果你想知道最大值:

vector<int> v;
// 插入數字並由小到大排序後
cout << *(v.end()-1);

錯誤

絕對不要這樣寫:

cout << *v.end();

要記住,v.end()是指向「最後一個元素的後面」!

同理可證,你當然也可以輸出*(v.begin()+3)( 第三個 )、*(v.end()-5)( 倒數第五個 )。也就是說,迭代器有加減法,而且他們的加減法分別代表往後跟往前

遍歷vector
#

相信你一定知道要怎麼遍歷一個陣列:

for(int i = 0; i < n; i++){
    cout << a[i] << '\n';
}

那你可能會想要這樣遍歷vector

for(int i = 0; i < v.size(); i++){
    cout << v[i] << '\n';
}

或者是你學會了剛剛教你的迭代器所以你想這樣寫:

for(vector<int>::iterator i = v.begin(); i != v.end(); i++){
    cout << *i << '\n';
}

其中,vector<int>::iterator是一種資料型態,就是指vector裡的迭代器。從一開始開始看,如果指到最後面就代表沒有東西了,否則就像我們剛剛舉例的「輸出第三個」一樣,用i++的方式輸出更後面的數字。你可能會覺得這個寫法還要打vector<int>::iterator太麻煩了不想寫,幸好,確實有一種寫法更簡潔:

for(auto i = v.begin(); i != v.end(); i++){
    cout << *i << '\n';
}

其中,auto是一種非常神奇的資料型態叫「自動變數類型」,他可以自動判斷你初始化它的東西是什麼資料類型。如果你宣告了auto i = 5;那他就是int,你宣告了auto i = 'a';那他就是char,你宣告了auto i = v.begin();那他就是vector<int>::iterator。那你可能還是覺得很懶,那恭喜你你賺到了,其實還能這樣寫:

for(auto i : v){
    cout << i << '\n';
}

這東西其實是從for_each這個東西來的,有興趣可以看看C++官網解釋。簡單來說,前面那個auto i( 其實也能寫int i )指的是說,我現在會跑過v裡的每個東西,然後i代表我現在跑到誰,好比說我有個vector裡面有 { 1, 2, 3 },那i就會從1變成2再變成3。這就是為什麼下面的cout << i <<'\n';*拿掉了。

Piau 的筆記本
作者
Piau 的筆記本
希望我寫下來的東西能夠長久的記在我的腦中