引入:2018年10月看《C++ Primer 第5版》而写的简单笔记
11.2.1定义关联容器
| map<string, size_t> map1; set<string> set1 = { "the","but","an" }; map<string, string> authors = { {"1","11"}, { "2","22" }, { "3","33" }, { "4","44" }, }; multiset<int> set3(ivec.begin(), ivec.end());// 40个元素 |
1. 关联容器概述 1)不支持顺序容器的位置相关的操作 如:push_back,push_front 2)支持一些顺序容器不支持的操作和类型别名。还提供一些用来调整哈希性能的操作 3)关联容器的迭代器都是双向的 2.定义关联容器 1)每个关联容器都定义了一个默认构造函数,指定类型的空类型 2)可以将关联容器初始化另一个同类型的拷贝,或一个值范围初始化关联容器 3)或者可以值初始化使用{},需能转换容器所需的类型 3. 初始化multimap或multiset 1)允许多个元素具有相同的关键字。 2)允许一个迭代器范围初始化,就是上面所说的值范围 |
11.2.2关联容器关键字要求
| 严格弱序 Map<Sales_data,decltype(compareIsbn)*> Bookstore(compareIsbn); |
1. 关键字类型的要求 1) 关联容器对关键字类型的限制是关键字类型必须定义元素比较的方法 2) Set集合关键字的类型是元素类型,map映射类型,第一部分元素是关键字类型 3) 所以传给排序算法的可调用对象,必须与关联容器中关键字的类型一样。 2. 有序容器的关键字类型 1) 我们可以自定义操作代替关键字上的<运算符,但是必须遵守 2) 严格弱序 3) 性质: [1] 两个关键字不能同时小于等于对方 [2] 若k1<k2,k2<k3,则k1<k3 [3] 若存在两个关键字,任何一个不小于另一个,则是等价的。K1等价k2,k2等价k3,k1等价k3 4) 若两个关键字等价则容器将他们视为相等来处理。Map中若两个关键字等价则只有一个元素对应,可以使用两个关键字分别访问到 Note:若一个类型定义了行为正常的<运算符,则它可以用作关键字类型 3. 使用关键字类型的比较函数 1) 自定义比较函数的话再创建set指定了元素类型后,接自定义比较函数的指针 2) 当我们创建一个容器对象时,才会以构造函数参数的形式提供真正的比较操作(其类型必须与在尖括号中指定的类型想吻合)Bookstore(compareIsbn); 3) 通过compareIsbn初始化bookstore对象,表示向bookstore添加元素时通过调用compareIsbn来为这些元素排序。 4) compareIsbn代替&compareIsbn作为构造函数,因为使用一个函数的名字时,需要的情况下会自动转换为一个指针,&compareIsbn也一样? |
11.2.3pair类型
| 头文件 utility pair<string, string> anon; pair<string, vector<int>> line; pair<int, int> pa1(1, 2); pair<int, int> pa2 = { 3,4 }; pair<int, int> pa3 = make_pair(5, 6); |
1. pair类型 1) 保存两个数据成员。类似容器,模板 2) 默认构造函数对数据成员进行值初始化 可以提供初始化器 可以用make_pair生成pair对象。 3) Pair的数据成员是public的,成员命名为first和seconde 2. 创建pair对象的函数 1) 可以对返回值进行列表初始化。早期不允许 2) 或者用make_pair pair<string, int> process(vector<string> &v) { if (!v.empty()) { return{ v.back(),v.back().size() };// 列表初始化 } else { return pair<string, int>();//隐式一个空的 } } |