迭代器的本質和使用

2021-08-28 14:19:45 字數 1552 閱讀 1873

迭代器:把標誌控制的迴圈和計數控制的迴圈統一為一種控制,即迭代器控制,每一次迭代操作中對迭代器的修改就等價於修改標誌或計數器。

容器迭代器:類似於資料庫中的游標(cursor),遮蔽了底層儲存空間的不連續性,在上層使容器元素維持一種「邏輯連續」的假象。工作邏輯如下:

stl把迭代器分為5類,它們都是類模板,具有通用性。如下表:

迭代器能力大小:輸入迭代器,輸出迭代器 <  前進迭代器 <  雙向迭代器 <  隨機訪問迭代器 

常用迭代器所屬迭代器類別:

& vector的迭代器為隨機訪問迭代器,因為它就是原始指標;

& list的迭代器是雙向迭代器,因為list是雙向鍊錶;

& slist的迭代器是前進迭代器;

& deque的迭代器是隨機訪問迭代器;

& set/map的迭代器是雙向迭代器;

迭代器使用建議:

1)盡量使用迭代器型別,而不是顯示地使用指標。例如使用vector::iterator,而不是int *,雖然他們等價。

2)只使用迭代器提供的標準操作,不要使用任何非標準操作,以避免stl版本更新的時候出現不相容問題。

3)當不會改動容器中元素值的時候,使用const迭代器(const_iterator)。

迭代器失效的危險性:迭代器失效是指其指向容器中的某個或某些元素的儲存發生了變化,使之成為無效迭代器,使用無效迭代器同時用無效指標一樣危險。

解決迭代器失效問題有兩種方式:1)在代用迭代器時重新獲取迭代器;2)在修改容器前為其預留足夠的空閒空間以避免儲存空間重分配。

解決無效迭代器示例如下:

//迭代器失效程式

#include

#include

using namespace std;

void main(){

vectorages;  //未預留空間

ages.push_back(2);  //引起記憶體重分配

vector::const_iterator p = ages.begin();

for(int i = 0; i<10; i++){

ages.push_back(5);  //引起若干次記憶體重分配

cout<

void main(){

vector::const_iterator p = ages.begin();

for(int i = 0;i<10; i++){

ages.push_back(5);  //引起若干次記憶體重分配

p = ages.begin();  //重新獲取迭代器

cout<

迭代器和增強for的使用

迭代器和增強for 解決異常 刪除演示 建立arraylist 集合 arraylist list newarraylist 新增集合 list.add csdn list.add 常家壯 list.add 部落格 迭代器建立 iterator iterator list.iterator 迴圈 快...

迭代器的使用

先看下面的例子 vector 的元素刪除 話頭從 container 的元素刪除說起。jyhuang 觀察到 如果 vector 或 list 的最後乙個元素符合刪除條件,程式會有問題 他給我這樣乙個片段 template void print elements t elem void pfi in...

迭代器的使用

參考 stl中的迭代器有五種型別,不同的容器可支援不同的迭代器 1.vector,支援隨機迭代器 include include include using namespace std int main cout endl cout endl vector iterator iter1 charve...