目录
11.1 使用关联容器
11.2 关联容器概述
11.2.1 定义关联容器
11.2.2 pair类型
11.3 关联容器操作
11.3.1 关联容器迭代器
11.3.2 添加元素
11.3.3 删除元素
11.3.4 map的下标操作
11.3.5 访问元素
两个主要的关联容器为map和set,map中元素是一些关键字—值对,关键字起索引的作用,值则表示与索引相关联的数据。set中每个元素只包含一个关键字,set支持高效的关键字查询操作——检查一个给定关键字是否在set中。
允许重复关键字的容器的名字开中都有包含单词multi,不保持关键字按顺序存储的容器的名字都以unordered开头。
11.1 使用关联容器
(1)经典的map程序
单词计数程序
mapword_count; string word; while (cin >> word) ++word_count[word]; for (const auto& w : word_count) cout << w.first << " occurs " << w.second << " 次 " << endl;
(2)set的使用
//忽略exclude中的单词进行计数 mapword_count; set exclude = { "the","but" }; string word; while (cin >> word) if(exclude.find(word)==exclude.end()) //find返回一个迭代器,指向该关键字,若不存在,则返回尾后迭代器 ++word_count[word]; for (const auto& w : word_count) cout << w.first << " occurs " << w.second << " 次 " << endl;
11.2 关联容器概述
11.2.1 定义关联容器
(1)mutiset使用的例子:
vectorv; for (int i = 0; i != 10; i++) { v.push_back(i); v.push_back(i); } set is(v.begin(), v.end()); multiset ms(v.begin(), v.end()); cout << is.size() << endl; //输出10 cout << ms.size() << endl; //输出20 cout << v.size() << endl; //输出20
11.2.2 pair类型
创建一个pair时,我们必须提供两个类型。
pair
其中两个成员分别命名为first和second,可以采用成员访问符访问他们。
创建pair对象的函数
有一个函数需要返回一个pair,我们可以对返回值进行列表初始化
pairprocess(vector &v) { //处理v if(!v.empty()) return { v.back(),v.back().size()} //列表初始化 else return pair (); //隐式构造返回值 }
11.3 关联容器操作
11.3.1 关联容器迭代器
map v;
auto map_it=v.begin() //获取一个指向v中一个元素的迭代器
//map_it是指向一个pair对象的引用
cout<first; //打印此元素的关键字
cout<second //打印此元素的值
mapv; auto map_it=v.begin() //获取一个指向v中一个元素的迭代器 //map_it是指向一个pair 对象的引用 cout< first; //打印此元素的关键字 cout< second //打印此元素的值
(1)set的迭代器是const的
set的迭代器只允许只读访问set中的元素,set中的关键字也是const的,可以用一个set迭代器来读取元素的值,但不能修改
sets = { 0,1,2,3,4,5,6 }; set ::iterator it = s.begin(); if (it != s.end()) { *it = 42; //无法修改 cout << *it << endl; }
11.3.2 添加元素
关联容器的insert成员向容器中添加一个元素或一个元素范围,由于map和set包含不重复的关键字,因此插入一个存在的元素对容器无影响。
vectorivec={2,4,6,8} set set2; set2.insert(ivec.begin(),ivec.end()) set2.insert({1,3,5,7})
insert有两个版本,分别接受一对迭代器,或是一个初始化器列表。
(1)向map添加元素
m.insert({word,1})
(2)insert的返回值
对于不包含重复关键字的容器,添加单一元素的insert版本返回一个pair,pair的first成员是一个迭代器,指向具有给定关键字的元素,second成员是一个bool的值,指出元素是插入成功还是已经存在于容器中,如果关键字已在容器中,则insert什么也不做,且返回值中的bool部分为false,若关键字不存在,元素被插入到容器中,且bool值为true。
11.3.3 删除元素
关联容器定义了三个版本的erase,可传递一个迭代器或一个迭代器对来删除一个元素或一个元素范围,指定元素被删除后返回void。
另一个版本没接收一个key_type参数,此版本删除所有匹配给定关键字的元素,返回实际删除的元素数量。
11.3.4 map的下标操作
map的下标运算符接受一个索引(即关键字),获取与此关键字相关联的值,若关键字不在map中,则会为其创建一个元素并插入到map中,关键值将进行值初始化。
11.3.5 访问元素
c.find(k):返回一个迭代器,指向第一个关键字为k的元素,若k不在容器中,则返回尾后迭代器
c.count(k):返回关键字等于k的元素数量,对于不允许重复关键字的容器,返回值永远是0或1
关键容器还提供两个特殊的函数,lower_bound和upper_bound,lower_bound返回的迭代器将指向第一个具有给定关键字的元素,而upper_bound返回的迭代器指向最后一个匹配给定关键的元素之后的位置。



