4.5 更易型算法和關聯式容器
關聯式容器的全部迭代器均被聲明爲指向常量,若是更易關聯式容器中的元素,會致使編譯錯誤。 因此,從關聯式容器中刪除元素,須要調用它們的成員函數。 list針對全部更易型算法提供了一些對應的成員函數,若是使用list,就應該使用這些成員函數,此外,這些成員函數真正移除或改變了元素,而不是算法提供的只是進行了某種「移動」。算法
5 判斷式
5.1 Unary Predicates(一元判斷式)
一元判斷式會檢查惟一參數的某項特性。例如:find_if編程
std::find_if(col.begin(),col.end(),isPrime);
//返回找到的符合條件的第一個元素的位置(迭代器)或返回傳入的第二個迭代器參數
Binary Predicates(二元判斷式)
二元判斷式的典型用途是,比較兩個參數的特定屬性。例如,爲了依照你本身的原則對元素排序,必須以一個簡單的predicate形式提供這項原則,若是元素自己不支持operator<,或若是你想使用不一樣的排序原則,二元判斷式就派上了用場。less
std::sort(col.begin(),col.end(),user_defined_func);
6 仿函數
仿函數是泛型編程強大威力和純粹抽象概念的又一個例證。任何東西,只要其行爲像函數,它就是一個函數。所謂的函數行爲,就是指「可使用小括號傳遞參數,以調用某個東西」的行爲。 仿函數的優點函數
- 仿函數是智能型函數(smart function),能夠有本身的狀態,能夠作到普通函數難以完成的事。
- 每一個仿函數都有本身的型別。
- 仿函數一般比通常函數速度快。
6.1 預先定義的仿函數
- operator<的缺省排序準則是less<>,因此,若是反向排列某些元素很簡單:
std::set<int,greater<int> > col;
- negate<in>() 將傳進來的int值設定爲負。
容器的使用注意事項
1. 容器元素的條件
STL容器元素必須知足一下三個基本要求:測試
- 必須可經過copy構造函數進行賦值,副本與本來必須相等。
- 必須可經過assignment操做符完成賦值動做
- 必須能夠經過析構函數完成銷燬操做
- 對序列容器而言,元素的default構造函數必須可用
- 對於某些動做,必須定義operator==以執行相等測試
- 在關聯式容器中,元素必須定義出排序準則。缺省爲operator<,經過less<>被調用
2. STL只支持value語意,不支持reference語意
3. STL的使用
- 迭代器務必合法而有效。注意:**迭代器可能會由於其餘動做的反作用而變得無效,例如當vector和deque發生元素的安插、刪除或從新配置時,迭代器可能所以失效
- 一個迭代器若是指向「逾尾(past-the-end)」位置,它並不指向任何對象,所以不能對它調用operator*或operator->。這一點適用於任何容器的end()和rend()所返回的迭代器
- 區間必須是合法的
- 某個區間的先後連個迭代器,必須指向同一個容器
- 從第一個迭代器出發,必須能夠到達第二個迭代器所指位置
- 若是涉及的區間不止一個,第二個區間及後繼各區間必須擁有「至少和第一個區間同樣多」的元素
- 覆蓋動做中的「目標區間」必須擁有足夠多的元素,不然必須使用insert iterator。
4. STL的異常處理
C++標準庫有以下保證:code
- 對於全部「以節點爲實現基礎」的容器如list、set、multiset、map和multimap,若是節點構造失敗,容器保持不變,移除節點的動做保證不會失敗
- 全部「以array爲構造基礎」的容器如vector和deque,安插元素時若是失敗,都不可能作到徹底回覆