部分摘自C++ Primer:程序員
全部的標準庫容器類都定義了相應的iterator類型,如vector:
vector<int>::iterator iter;oop
這條語句定義了一個名爲iter的變量,它的數據類型是由vector<int>定義的iterator類型。this
理解一下:除了使用下標來訪問vector對象的元素外,標準庫還提供了另外一種檢測元素的方法:使用迭代器(iterator)。迭代器是一種容許程序員檢查容器內元素,並實現元素遍歷的數據類型。spa
vector <int>::iterator iter=vt.begin();//起始地址
vector <int>::iterator iter_end=vt.end();//結束地址指針
兩個地址都是指針類型,end操做返回的迭代器指向vector的「末端元素的下一個」,指向了一個不存在的元素。若vector爲空,begin和end返回的迭代器相同。由end操做返回的迭代器並不指向vector中任何實際的元素,相反,它只是起一個哨兵(sentinel)的做用,表示咱們已處理完vector中全部元素。code
1.使用迭代器遍歷vector元素:對象
vector<int> ivec(1,2); for(vector<int>::iterator iter=ivec.begin();iter!=ivec.end();++iter) { *iter = 0; //使用 * 訪問迭代器所指向的元素 }
vector<int>::const_iterator 和 const vector<int>::iterator有區別blog
const vector<int>::iterator newiter=ivec.begin(); *newiter=0; //能夠修改指向容器的元素 //newiter++; //迭代器自己不能被修改
2.迭代器基本操做:ip
iter++, ++iter, iter- -, --iter, iter+n, iter-n, iter1-iter2element
3.注意伍是迭代器失效:
任何改變vector長度的操做都會使已存在的迭代器失效。例如,在調用push_back之後,就不能再信賴指向vector的迭代器的值了。
修改容器的內在狀態或者移動容器內的元素,這樣的操做使得全部指向被移動的元素的迭代器失效,也可能同時使得其餘迭代器失效。
例如添加元素時,可能會致使容器的從新加載,這樣該容器涉及的迭代器都將失效。即便不從新加載,指向新插入元素後面的那個元素的迭代器也會失效。
任何insert、push操做均可能致使迭代器失效,所以要確保迭代器每次循環後都獲得更新。
vector<int>::iterator first = v.begin(), last = v.end(); // cache end iterator // Diaster: behavior of this loop is undefined while (first != last) { // do some processing // insert new value and reassign first, which otherwise would be invalid first = v.insert(first, 42); ++first; // advance first just past the element we added }
上述代碼的行爲是未定義的。在不少實現中,該段代碼將致使死循環。
問題在於這個程序將 end 操做返回的迭代器值存儲在名爲 last 的局部變量中。
循環體中實現了元素的添加運算,添加元素會使得存儲在 last 中的迭代器失效。
該迭代器既沒有指向容器 v 的元素,也再也不指向 v 的超出末端的下一位置。
添加或刪除 deque 或 vector 容器內的元素都會致使存儲的迭代器失效。
因此,不要存儲 end 操做返回的迭代器。
爲了不存儲 end 迭代器,能夠在每次作完插入運算以後從新計算 end 迭代器值:
// Safer: recalculate end on each trip whenever the loop adds/erases elements while (first != v.end()) { // do some processing first = v.insert(first, 42); // insert new value ++first; // advance first just past the element we added }
本身的備註:
是否能夠直接把iterator當成一個指針來看?好比說 vector<int> v; vector<int>::iterator iter; // 其實裏面的iterator 你能夠這麼理解typedef int* iterator; // 是一個指向所屬容器的指針 iter = v.begin()//指向v容器的第一個元素 能夠對iter作增與減的操做 ++iter; --iter;