以map容器為例:
第一:前置++和後置++的區別
1.使用typedef定義map容器的迭代器 typedef map::const_iterator cit;
2.定義迭代器物件cit cit;
3.定義map容器mapclientinfomap;
4.遍歷map容器裡的內容(cit->first:獲取map容器的關鍵字,cit->second:獲取map容器的關鍵值):
for(cit=clientinfomap.begin();cit!=clientinfomap.end();cit++)
分析:cit迭代器的前置++和後置++區別;cit在迴圈中遍歷次數相同,但是效率不同,前置++返回的是引用,後置++先返回乙個臨時物件再進行自加,也就是說
後置++在迴圈時每遍歷乙個元素,就建立並銷毀乙個無用的臨時物件,造成了不必要的程式效率的損失。因此在用迭代器進行遍歷時請盡量使用前置++操作
如下:
for(cit=clientinfomap.begin();cit!=clientinfomap.end();++cit)
在程式除錯的時候,f11跟蹤上面的++cit**可以定位到容器的內部實現:
前置++在容器中的內部實現
_myiter& operator++()
後置++在容器中的內部實現(會建立乙個臨時的物件_tmp)
_myiter operator++(int)
第二:容器返回的迭代器方法:begin() 和end()講解
1.begin()是容器裡所有元素的首個元素的指標(實際就是乙個位址)
2.end()是容器裡所有元素的末尾的指標再加1,也就是指向最後乙個元素的下乙個位置
這裡這樣設計是合理的,兩點:
2.1 使用for迴圈查詢容器裡的元素的時候可以使用:自增的迭代器cit 不等於 末尾迭代器clientinfomap.end() 來判斷容器裡的所有元素全部遍歷完成
for(cit=clientinfomap.begin();cit!=clientinfomap.end();++cit)
2.2 還可以使用 第乙個元素迭代器clientinfomap.begin() 等於 末尾迭代器clientinfomap.end() 來判斷容器裡沒有元素
if(clientinfomap.begin()==clientinfomap.end())
STL原始碼(2) 迭代器 trait
const iterator 不可通過迭代器改變所指的物件 一 iterator traits 演算法在使用iterator的時候需要知道迭代器指向物件的屬性,如果這裡的迭代器是乙個物件,則可以通過 直接獲取,但是如果迭代器是乙個指標,不能直接獲取。因此需要traits來獲取迭代器指向物件的屬性。二...
stl 2 初始容器迭代器演算法
include std cout std endl 螢幕輸出需要的標頭檔案 include vector容器和vector迭代器需要的標頭檔案 include for each演算法需要的標頭檔案 宣告乙個for each演算法需要用到的 函式 void myprint int v int main...
STL迭代器失效的問題
內部資料結構 連續儲存,例如陣列。隨機訪問每個元素,所需要的時間為常量。在末尾增加或刪除元素所需時間與元素數目無關,在中間或開頭增加或刪除元素所需時間隨元素數目呈線性變化。可動態增加或減少元素,記憶體管理自動完成,但程式設計師可以使用reserve 成員函式來管理記憶體。迭代器失效 插入 vecto...