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)*>;

你可能感兴趣的:(C++primer 第十一章笔记 初稿)