关联容器
Posted GGBeng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关联容器相关的知识,希望对你有一定的参考价值。
前言
关联容器并不值得写一篇讲解的文章,它只是部分细节需要熟能生巧。
一、关键点
向map、set中添加元素
使用map、set
关联容器的元素类型
二、关联容器支持的类型别名
类型别名 | 具体说明 |
key_type | 此容器类型的关键字类型 |
mapped_type | (只适用于map)每个关键字关联的类型 |
value_type |
对于set,与key_type相同 对于map,为pair<const key_type, mapped_type> |
其他类型别名参见顺序容器:iterator、size_type等 |
使用示例:(我们使用作用域运算符来提取一个类型的成员)
set<string>::value_type v1; //v1是一个string set<string>::key_type v2; //v2是一个string map<string, int>::value_type v3; //v3是一个pair<const string, int> map<string, int>::key_type v4; //v4是一个string map<string, int>::mapped_type v5; //v5是一个int
三、使用map
如单词计数程序是这么定义map的:map<string, size_t> wordCount;
对于该map对象wordCount中的每个元素,关键字是string类型,值是size_t类型(在一个map中,元素是关键字-值对,即每个元素是一个pair对象)
1. 初始化map
map<string, string> family = { {"Dad", "Xinhong"}, {"Mom", "Meiyun"}, {"Son", "Liuyu"} };
2. 使用迭代器打印map对象
map<string, size_t>::iterator map_it = wordCount.begin(); //解引用该迭代器时,我们会得到一个pair类型的引用 cout << map_it->first << " " << map_it->second << endl;
3. 向map添加元素——使用insert成员
- 之所以将这个点列入关键点,是因为插入一个已存在的元素对容器(特指map/set)没有任何影响,只有当元素的关键字不在容器中时才插入。
对于一个map进行insert操作时,必须记住元素类型是pair,我们可以在insert的参数列表中创建一个pair:
wordCount.insert({word, 1}); wordCount.insert(make_pair(word, 1)); wordCount.insert(pair<string, size_t>(word, 1)); wordCount.insert(map<string, size_t>::value_type(word, 1));
添加单一元素的insert版本返回一个pair,该pair的first成员是一个迭代器,second成员是一个指示插入是否成功的bool值:
//pair的first成员是一个map迭代器,指向wordCount中关键字为word的元素 pair<map<string, size_t>::iterator, bool> ret = wordCount.insert(make_pair(word, 1));
更多insert操作见附录。
4. 从map删除元素
对一个关联容器进行erase操作时,只要关注各个版本的返回类型:
auto cnt = wordCount.erase(word); //从wordCount中删除每个关键字为word的元素,返回删除元素的数量 auto it = wordCount.erasr(p); //从wordCount中删除迭代器p指定的元素,返回一个指向p之后元素的迭代器 auto it = wordCount.erase(b, e); //删除迭代器对b和e所表示的范围中的元素,返回e
5. map的下标操作
下标的类型为key_type,map下标运算符接受一个关键字,获取与此关键字相关联的值(如果有该关键字的元素存在的话)。
如果关键字并不在map中,会为它创建一个元素并插入到map中,关联值将进行值初始化。
四、使用set
只保存关键字的容器,关键字的值是不能改变的
1. 添加元素
vector<int> ivec = {2, 3, 5, 7, 11}; set<int> iset; iset.insert(ivec.cbegin(), ivec.cend()); iset.insert({1, 2, 3, 4, 5}); //iset中元素为{1, 2, 3, 4, 5, 7, 11}
insert有两个版本:接受一对迭代器;接受一个初始化器列表
返回类型同map
2. 访问元素
操作 | 说明 |
c.find(k) | 返回一个迭代器,指向第一个关键字为k的元素;若k不在容器中,则返回尾后迭代器 |
c.count(k) | 返回关键字等于k的元素的数量,不在则为0 |
c.lower_bound(k) | 返回一个迭代器,指向第一个关键字不小于k的元素 |
c.upper_bound(k) | 返回一个迭代器,指向第一个关键字大于k的元素 |
c.equal_range(k) | 返回一个迭代器pair,表示关键字等于k的元素的范围;若k不存在,pair的两个成员均等于c.end() |
附录
1. 关联容器insert操作
操作 | 说明 |
c.insert(v) c.emplace(args) |
v是value_type类型的对象;args用来构造一个元素 对于map和set,只有当元素的关键字不在c中时才插入(或构造)元素 对于multimap和multiset,总会插入(或构造)给定元素 |
c.insert(b, e) |
b和e是迭代器,表示一个c::value_type类型值的范围 |
c.insert(il) | |
c.insert(p, v) c.emplace(p, args) |
2. pair类型
3. 指定使用自定义的操作来组织一个关联容器中的元素
multiset<Sales_data, decltype(compareIsbn)*> bookstore(compareIsbn);
以上是关于关联容器的主要内容,如果未能解决你的问题,请参考以下文章