首先是迭代器的原理:
迭代器是以類似指標的原理進行容器中的數值操作,begin() end() rend() rbegin()都是容器上的記憶體位置
vector<int>::iterator i = v.begin()就相當於創建一個迭代器指向vector v容器的第一個元素的位置
而i++ i-- i+=2 i+3等都是移動迭代器的位置,透過移動迭代器可以達到讀取元素和進行修改的目的
在迴圈中使用i != v.end()和i < v.end()就是讓迭代器指到最後一個元素也就是v.end()-1時停止的條件
由下面的程式與輸出結果可以發現,迭代器在進行操作時,即使改變指向的元素也不會改變迭代器的記憶體位置,這是因為在進行操作時是改變迭代器指向的位置而非迭代器本身。
#include <iostream> #include <vector> using namespace std; int main() { vector<int> v; for (int n = 0; n < 10; ++n) { v.push_back(n); } vector<int>::iterator i; i = v.begin(); cout << *i << " "; cout << &i << endl; i = v.end() - 1; cout << *i << " "; cout << &i << endl; return 0; } |
0 0x61fefc
9 0x61fefc
根據C語言中文網的整理,C++中不同的容器會對應到不同的迭代器,而迭代器中有四種不同的定義方式
首先是在Vector中應用迭代器進行遍歷操作,在學會使用迭代器之前都是用for (int i = 0; i < v.size(); ++i)之類的操作來遍歷Vector中的內容,如果使用迭代器進行操作的話即使是不支援索引操作的容器如list也能進行遍歷操作,還有迭代器具有反向迭代器能在進行從結尾往開頭遍歷時能夠使用。
而迭代器的使用方法就如上方截圖一樣是
(使用容器的類別 如Vector)::(迭代器類型) 迭代器的名字
下方是使用迭代器進行遍歷操作的程式
輸出結果:
常量迭代器無法對容器中的元素進行修改的操作:
#include <iostream> #include <vector> using namespace std; int main() { vector<int> v; for (int n = 0; n < 10; ++n) { v.push_back(n); } cout<<"Type1:"<<endl; //在for迴圈中宣告迭代器並以迭代器進行遍歷操作 for (vector<int>::iterator i = v.begin(); i != v.end(); i++) { cout << *i << " "; } cout << endl; cout<<"Type2:"<<endl; //讓迭代器以每次移動兩個元素的方式輸出內容 for (vector<int>::iterator i = v.begin(); i < v.end(); i += 2) { cout << *i << " "; } cout << endl; cout<<"Type3:"<<endl; // 用反向迭代器遍历容器 for (vector<int>::reverse_iterator r = v.rbegin(); r != v.rend(); r++){ cout << *r << " "; } return 0; } |
輸出結果:
常量迭代器無法對容器中的元素進行修改的操作:
最後是用迭代器遍歷list的操作
不能使用index索引來操作的list可以透過迭代器來進行元素的操作
#include <list> #include <iostream> using namespace std; int main() { list<int> l = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; for (list<int>::iterator i = l.begin(); i != l.end(); i++) { *i = *i * 2; cout << *i << ", "; } cout << endl; for (list<int>::reverse_iterator r = l.rbegin(); r != l.rend(); r++) { *r = *r / 2; cout << *r << ", "; } return 0; } |