C 知識總結 P04 迭代器與演算法庫

2022-09-13 01:12:11 字數 1399 閱讀 9462

迭代器用於遍歷容器。迭代器比較重要的一點是 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));

使用 lambda
auto 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...