六一的部落格


关关难过关关过,前路漫漫亦灿灿。



关键字到值的映射


键值对

key-value

标准库类型 pair . map容器的元素类型

关键字起到索引的作用, 值则表示与索引关联的数据

pair类型拥有两个数据成员:

  1. 定义pair类型对象时, 需提供这两个数据成员的类型
  2. 均为公有数据成员, 程序员可直接使用

头文件

1#include <utility>

定义pair类型对象

  1. 默认初始化

    默认构造函数对数据成员进行值初始化
    1pair<T1, T2> p;
  2. 列表初始化
    1pair<T1, T2> p = {v1, v2};
  3. 直接初始化

    两个成员分别用v1和v2初始化
    1pair<T1, T2> p(v1, v2);   
    
  4. 使用make_pair操作构造pair对象
    1make_pair(v1, v2);        // 返回一个用v1和v2初始化的pair对象. pair的类型根据v1和v2的类型进行推断
    

示例

1pair<string, string> anon;                // 两个空字符串
2pair<string, size_t> word_count;          // 空字符串 + 0
3pair<string, vector<int>> line;           // 一个空字符串和一个空vector
4
5pair<string, string> author{"James", "Joyce"};

访问pair公有数据成员

  1. map系列关联容器使用first存放关键字, 使用second存放值
  2. map系列的first成员具有顶层const
1p.first;
2p.second;

比较pair对象

  1. 判断pair对象相等/不等

    1p1 == p2;
    2// <= (p1.first == p2.first && p1.second == p2.second)
    3
    4p1 != p2;
    5// 利用(p1 == p2)实现
    6// <= !(p1 == p2)
    
  2. 比较pair对象大小

    只使用小于运算符

    1p1 < p2;
    2// <= (p1.first < p2.first) 或者 !(p2.first < p1.first) && p1.second < p2.second)
    

示例: pair作为函数返回类型

如果容器不为空, 返回最后一个元素及其长度; 返回空串和0

 1pair<string, int> process(vector <string> &v)
 2{
 3    // 处理v
 4
 5    if (!v.empty())
 6        return {(v.back(), v.back().size()};            // 列表初始化
 7    else 
 8        return pair<string, int>();                     // 构造返回值
 9
10// return pair<string, int>((v.back(), v.back().size());
11// return make_pair(v.back(), v.back().size());
12}

map的关键字类型

如果两个关键字等价, 其对应同一个元素; 我们可以用任意一个关键字来访问对应的值


比较键值对里的关键字

  1. 只使用小于运算符
  2. 如果(p2.first < p1.first)不成立,(p1.first < p2.first)必成立
(p1.first < p2.first)为真 <=> !(p2.first < p1.first)为真

定义map

需给出元素键值对类型

1map<T1, T2> m;    // 元素类型为pair<const T1, T2>

元素的关键字不可修改


创建空容器

1map<string, size_t> word_count;

列表初始化

1map<string, string> authors = { {"Joyce", "James"},
2                                {"Austen", "Jane"},
3                                {"Dickens", "Charles"} };

遍历map, 得到pair类型元素

1for (const auto &author : authors)
2    cout << author.first << "/t" << author.second << endl;

关联容器: map


关键字到值的映射


键值对

key-value

标准库类型 pair . map容器的元素类型

关键字起到索引的作用, 值则表示与索引关联的数据

pair类型拥有两个数据成员:

  1. 定义pair类型对象时, 需提供这两个数据成员的类型
  2. 均为公有数据成员, 程序员可直接使用

头文件

1#include <utility>

定义pair类型对象

  1. 默认初始化

    默认构造函数对数据成员进行值初始化
    1pair<T1, T2> p;
  2. 列表初始化
    1pair<T1, T2> p = {v1, v2};
  3. 直接初始化

    两个成员分别用v1和v2初始化
    1pair<T1, T2> p(v1, v2);   
    
  4. 使用make_pair操作构造pair对象
    1make_pair(v1, v2);        // 返回一个用v1和v2初始化的pair对象. pair的类型根据v1和v2的类型进行推断
    

示例

1pair<string, string> anon;                // 两个空字符串
2pair<string, size_t> word_count;          // 空字符串 + 0
3pair<string, vector<int>> line;           // 一个空字符串和一个空vector
4
5pair<string, string> author{"James", "Joyce"};

访问pair公有数据成员

  1. map系列关联容器使用first存放关键字, 使用second存放值
  2. map系列的first成员具有顶层const
1p.first;
2p.second;

比较pair对象

  1. 判断pair对象相等/不等

    1p1 == p2;
    2// <= (p1.first == p2.first && p1.second == p2.second)
    3
    4p1 != p2;
    5// 利用(p1 == p2)实现
    6// <= !(p1 == p2)
    
  2. 比较pair对象大小

    只使用小于运算符

    1p1 < p2;
    2// <= (p1.first < p2.first) 或者 !(p2.first < p1.first) && p1.second < p2.second)
    

示例: pair作为函数返回类型

如果容器不为空, 返回最后一个元素及其长度; 返回空串和0

 1pair<string, int> process(vector <string> &v)
 2{
 3    // 处理v
 4
 5    if (!v.empty())
 6        return {(v.back(), v.back().size()};            // 列表初始化
 7    else 
 8        return pair<string, int>();                     // 构造返回值
 9
10// return pair<string, int>((v.back(), v.back().size());
11// return make_pair(v.back(), v.back().size());
12}

map的关键字类型

如果两个关键字等价, 其对应同一个元素; 我们可以用任意一个关键字来访问对应的值


比较键值对里的关键字

  1. 只使用小于运算符
  2. 如果(p2.first < p1.first)不成立,(p1.first < p2.first)必成立
(p1.first < p2.first)为真 <=> !(p2.first < p1.first)为真

定义map

需给出元素键值对类型

1map<T1, T2> m;    // 元素类型为pair<const T1, T2>

元素的关键字不可修改


创建空容器

1map<string, size_t> word_count;

列表初始化

1map<string, string> authors = { {"Joyce", "James"},
2                                {"Austen", "Jane"},
3                                {"Dickens", "Charles"} };

遍历map, 得到pair类型元素

1for (const auto &author : authors)
2    cout << author.first << "/t" << author.second << endl;