iterator迭代器的使用


部分摘自C++ Primer:

所有的標准庫容器類都定義了相應的iterator類型,如vector:
vector<int>::iterator iter;

這條語句定義了一個名為iter的變量,它的數據類型是由vector<int>定義的iterator類型

理解一下:除了使用下標來訪問vector對象的元素外,標准庫還提供了另一種檢測元素的方法:使用迭代器(iterator)。迭代器是一種允許程序員檢查容器內元素,並實現元素遍歷的數據類型。

vector <int>::iterator iter=vt.begin();//起始地址
vector <int>::iterator iter_end=vt.end();//結束地址

兩個地址都是指針類型,end操作返回的迭代器指向vector的“末端元素的下一個”,指向了一個不存在的元素。若vector為空,begin和end返回的迭代器相同。end操作返回的迭代器並不指向vector中任何實際的元素相反它只是起一個哨兵sentinel的作用表示我們已處理完vector中所有元素。

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有區別

const vector<int>::iterator newiter=ivec.begin();
*newiter=0; //可以修改指向容器的元素
//newiter++; //迭代器本身不能被修改 

2.迭代器基本操作:

iter++, ++iter, iter- -, --iter, iter+n, iter-n, iter1-iter2

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;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM