STL學習筆記(二)

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 預先定義的仿函數

  1. operator<的缺省排序準則是less<>,因此,若是反向排列某些元素很簡單:
std::set<int,greater<int> > col;
  1. 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()所返回的迭代器
  • 區間必須是合法的
  1. 某個區間的先後連個迭代器,必須指向同一個容器
  2. 從第一個迭代器出發,必須能夠到達第二個迭代器所指位置
  • 若是涉及的區間不止一個,第二個區間及後繼各區間必須擁有「至少和第一個區間同樣多」的元素
  • 覆蓋動做中的「目標區間」必須擁有足夠多的元素,不然必須使用insert iterator。

4. STL的異常處理

C++標準庫有以下保證:code

  • 對於全部「以節點爲實現基礎」的容器如list、set、multiset、map和multimap,若是節點構造失敗,容器保持不變,移除節點的動做保證不會失敗
  • 全部「以array爲構造基礎」的容器如vector和deque,安插元素時若是失敗,都不可能作到徹底回覆
相關文章
相關標籤/搜索