C++primer 第十一章筆記 初稿

11.1 使用關聯容器

  1. 分類

    • 有序容器

      • map
      • set
      • multimap
      • multiset
    • 無序容器

      • unordered_map
      • unordered_set
      • unordered_multimap
      • unordered_multiset

    注:set只儲存key,map儲存key/value,有multi前綴的key可重複。

  2. map的基本使用
    經常使用下標運算符訪問map中的值,下標爲鍵。當map中並未存在對應鍵時,則下標運算符會創建一個新元素,其鍵爲下標值,併爲其初始化。

  3. set的基本操作
    經常使用find函數來確認是否存在對應鍵。

11.2 關聯容器概述

  1. 順序容器中的很多操作,包括位置操作、插入操作等,對關聯容器沒有意義,因此也不被關聯容器支持。

  2. 初始化關聯容器方式與順序容器類似,既可以列表初始化,也可以拷

    注:對非multi前綴的關聯容器,初始化時會自動過濾重複鍵(鍵值對)

  3. 關鍵字必須嚴格弱序,在定義關聯容器時,可以指定自定義的比較函數,例如

bool compare(const A& a1, const A& a2){...}  
multiset<A, decltype(compareA)*> set1(compare); 

其中比較操作類型爲函數指針。

  1. pair類型

    • 頭文件:utility

    • 訪問權限:public

    • 成員:first、second

    • 創建方式:

      • 括號初始化或列表初始化
      • make_pair(v1,v2)
      • pair

11.3 關聯容器操作

  1. 類型別名(通過域操作符使用)

    • key_type:鍵類型
    • mapped_type:值類型
    • value_type:對於set爲鍵類型,對於map爲pair類型;

    注:map的value_type所生成的pair,其鍵類型爲const類型。

  2. 迭代器
    無論是否爲const迭代器,都不可以改變鍵;
    常用inserter插入值或對;

  3. 泛型算法

    • 一般使用關聯容器自帶的find算法。
    • 通過inserter來將關聯容器作爲一個目的位置。

    不存在copy(c.begin(),v.end(),back_inserter(c))。

  4. 刪除:實參爲鍵或迭代器

  5. 下標

    注:關聯容器的下標返回類型與解引用迭代器返回類型不同。下標返回mapped_type,而解引用返回value_type。

  6. find與count

    • 可以避免下標帶來的鍵增加;
    • 利用關聯容器中,鍵相同的元素相鄰存儲的特性,可以結合find與count,利用迭代器遍歷同鍵元素。

    注:通過lower_bound和upper_bound迭代器也可以實現相似操作。

11.4 無序容器

  1. 組織方式:哈希函數和==運算符
  2. 有序容器與無序容器可以實現相互轉化;
  3. 存儲方式:桶(性能依賴於哈希函數及桶的數量和大小);
  4. 生成哈希值
    • 使用hash類型對象生成
    • 標準庫爲內置類型定義了hash模板
    • 自定義類型需要提供自己的hash模板
//未重載 == 運算符
unordered_multiset<Class, decltype(hasher)*, decltype(eqOp)*>;
//重載了 == 運算符
unordered_multiset<Class, decltype(hasher)*>;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章