STL基礎2 模版迭代器的幾點注意事項

2021-06-11 21:28:56 字數 1367 閱讀 4627

以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...