引入:2018年10月看《C++ Primer 第5版》而写的简单笔记
11.3.1关联容器迭代器
| Set:key_type value_type Map: key_type value_type mapped_type set<string>::key_type v1; set<string>::value_type v2; map<string, int>::value_type v3; map<string, int>::key_type v4; map<string, int>::mapped_type v5; |
1. 关联容器操作 1) Set的key_type与value_type是一样的 2) Map的value_type是pair,first是关键字类型,second是value类型 Mapped_type是值类型,key_type是关键字类型 2. 关联容器迭代器 1) 解引用关联容器的迭代器或得到value_type类型的值引用。对于map来说是pair类型。 2) Pair的关键字是const的不能改变,second是值,可以改变值不能改变关键字 3. Set的迭代器是const的 1) set的迭代器是const的,set的关键字也是const的 不能修改 2) 即使有iterator与constiterator但是都一样不能修改 4. 遍历关联容器 1) 遍历关联容器 可以用迭代器 Note:迭代器按关键字升序遍历元素 5. 关联容器和算法 1) 因为关键字是const的不能用于泛型算法中重排容器元素的算法 2) 关联容器不能通过关键字快速查找,使用泛型算法的find是个坏主意,可以使用关联容器自定义的find的成员,给定关键字直接获取元素。 3) 若想使用泛型算法,可以把关联容器当做原序列或目的位置,如:copy算法将元素从一个关联容器到另一个序列,与inserter插入器绑定到一个关联容器做目的位置 |
11.3.2添加元素
| Insert set1.insert(ive1.cbegin(), ive1.cend()); set1.insert({ 1,3,4,5,7,1,3,7 }); map1.insert({"st", 1}); map1.insert(make_pair("st", 1 )); map1.insert(pair<string,size_t> ( "st", 1 )); map1.insert(map<string,size_t>::value_type( "st", 1 )); auto paisreturn = word_count2.insert({cinstr,1}); ++(( paisreturn.first)->second); Pair<map<string,size_t>::iterator,bool> .. mulmap1.insert({ "liujianjie","b" }); |
1. 添加元素 1) 关联容器通过insert添加,若添加已有关键字的值不影响map与set。 2) Insert两个版本。一个接受迭代器,一个初始化器列表 2. 向map添加元素 1) '需是pair类型,可以用4中方法构造。 3. 检测insert的返回值 1) Insert返回的类型是Pair<map<string,size_t>::iterator,bool> 2) 一个pair,pair的first是一个迭代器也是一个pair一样,second是一个bool表示是否成功 4. 展开递增语句 1) …. 5. 向multiset或multimap添加元素 1) 插入总是成功,所以insert返回的pair无bool |
11.3.3删除元素
| map<int, int> map1{ {1,1},{ 2,2 },{ 3,3 },{ 4,4 },{ 5,5 } }; map1.erase(5); |
1. 删除元素 1) Earse三个版本 一个迭代器 返回void 一对迭代器 返回void 一个key_type 返回删除的数量 2)返回数量1或0,但若是可重复的返回多个 |
11.3.4map的下标操作
| map<int, int> map1{ { 1,1 },{ 2,2 },{ 3,3 },{ 4,4 },{ 5,5 } }; int a1 = map1.at(2); map1[6] = 6; |
1. map的下标操作 1) map和unordered_map容器提供了下标运算符和at函数 2) set不支持下标,因为set么有关键字相连的值,没有意义 3)不能对multimap与unorderred_multimap进行下标操作,因为这些容器中有可能有多个值与一个关键字相关联 4)Map的下标运算符,如果关键字不存在map,会创建一个元素并插入到map中,关联值将进行初始化。 步骤: [1].搜索Anna元素,未找到 [2].将新的关键字-值对插入到word_count中,关键字是一个conststring,保存anna,值进行值初始化,为0 [3].提取新插入的元素,并将值1赋予它 5) 只能非const的map和unordered_map 2. 使用下标操作的返回值 1)map的下标运算(返回mapped_type)与解引用一个迭代器返回的类型不同(返回value_type) 2)正常的下标运算与解引用迭代器得到同样的类型 3)相同的是返回的是左值,可以修改 |
11.3.5访问元素
| set1.count(4) set1.find(4) map1.find(4) == map1.end() lower_bound upper_bound queal_range |
1. 访问元素 1)有多种查找一个指定元素 2)Find与count差不多,但在可重复的容器中,不想计数 就用find 2. 对map使用find代替下标操作 1)下标会有额外工作,所以用find,找到就找到指向关键字为k的迭代器,没有就为end尾后迭代器 3. 在multimap或multiset中查找元素 1)允许重复关键字中,查找所有关键字所对应的元素。 2)因为可重复容器的元素会相邻存储,所以可以find与count配合使用,count控制循环,find找到的迭代器前进多少 4. 一种不同的,面向迭代器的解决方法 1)lower_bound upper_bound得到迭代器范围 2)若给定关键字是容器的关键字最大的,则upper_bound返回尾后迭代器,若关键字不存在,且大于容器中任何关键字,则lower_bound返回的也是尾后迭代器 Note:若关键字不在容器中,low_bound返回关键字的第一个安全插入点-不影响容器中元素顺序的插入位置。 Note:lower_bound与upper_bound返回相同的迭代器,则给定的关键字不在容器中 5. Equal_range函数 1)接受一个关键字,返回一个pair,first为第一个与关键字匹配的元素,第二个迭代器指向最后一个匹配元素之后的位置。未找到,两个迭代器都指向关键字可以插入的位置 2)Pair<map<string,size_t>,map<string,size_t>>;访问pair.fisrt->second; 代码: multimap<string, string> mulmap1({ {"liu","c"} ,{ "liu2","c" } ,{ "liu3","c" } ,{ "liu","a" } ,{ "liu","b" } }); string search_item("liu"); auto entries = mulmap1.count("liu"); auto iter1 = mulmap1.find(search_item); while (entries) { cout << (*iter1).second << endl; ++iter1; --entries; } auto beg = mulmap1.lower_bound("liu"); auto end = mulmap1.upper_bound("liu"); while (beg != end) { cout << (*beg).second << endl; ++beg; } auto range1 = mulmap1.equal_range("liu"); while (range1.first != range1.second) { cout << range1.first->second << endl; cout << (*range1.first).second << endl; ++range1.first; } |
11.3.6一个单词转换的map
例子...略