迭代器用於遍歷容器。迭代器比較重要的一點是 end() 對應的迭代器並不指向結尾元素,而是結尾元素的後面乙個,是無法解引用的。
雖然都是通過相同的介面獲得迭代器,但是不同的容器返回的迭代器是有差別的。
迭代器輔助函式
此外還要注意一些容器不支援反向迭代器。
範圍 for 可以方便地迭代容器,只要操作的物件coll
滿足以下條件之一:
有begin()
,end()
成員函式;
可以作為全域性性的begin()
,end()
函式的實參;
是initializer_list
,也即使用{}
包圍而資料;
是乙個陣列。
就可以使用範圍 for。注意靈活地使用&
避免不必要的拷貝。
普通函式、函式物件 和 lambda 都可以作為函式引數。
lambda
(){}
// parameter: 引數傳遞
// statmements: 執行語句
// capture: 指明與外部作用域的關係
// [=] lambda 內部可以讀取所有外部作用域的資料;
// [&] lambda 內部可以讀寫所有外部作用域的資料;
// [x, &y] lambda 內部可以讀取外部的 x,但不能修改;可以讀寫外部的 y
// (x, &y) 此時的 x, y 都是形參,在 lambda 內部修改 x 不會對外部的實參產生影響,但是修改 y 實際是修改外部的實參。
// 一些使用 lambda 的方法
auto cmp = (int x, int y) ;
bool result = (int x, int y) (100, 50); // lambda 直接呼叫
sort(vec.begin(), vec.end(), (auto& e1, auto& e2));
使用 lambdaauto cmp = (int a, int b);
sort(v.begin(), v.end(), cmp);
使用普通函式bool cmp(int a, int b)
sort(v.begin(), v.end(), cmp);
使用普通物件struct cmp
};sort(v.begin(), v.end(), cmp()); // 注意這裡多加了乙個括號
演算法庫中包含許多不同功能的函式,涵蓋比較廣, 可以參考 c++ reference / algorithm。僅僅閱讀文件可能無法弄清楚這些成員函式的具體表現,需要在實踐中多累積經驗。 c 下迭代器總結
目錄 本章並不研究不同型別的迭代器,只總結常見迭代器的使用和誤區。定義 迭代器 iterator 有時又稱游標 cursor 是程式設計的軟體設計模式,可在容器物件 container,例如鍊錶或陣列 上遍歷的介面,設計人員無需關心容器物件的記憶體分配的實現細節。背景 指標可以用來遍歷儲存空間連續的...
C 迭代器失效情況總結
迭代器失效分三種情況考慮,也是分三種資料結構考慮,分別為陣列型,鏈表型,樹型資料結構。陣列型資料結構 該資料結構的元素是分配在連續的記憶體中,insert和erase操作,都會使得刪除點和插入點之後的元素挪位置,所以,插入點和刪除掉之後的迭代器全部失效,也就是說insert iter 或erase ...
C 之迭代器失效總結
1.對於序列式容器 如vector,deque 序列式容器就是陣列式容器,刪除當前的iterator會使後面所有元素的iterator都失效。這是因為vetor,deque使用了連續分配的記憶體,刪除乙個元素導致後面所有的元素會向前移動乙個位置。所以不能使用erase iter 的方式,還好eras...