前言

关联容器并不值得写一篇讲解的文章,它只是部分细节需要熟能生巧。

 

一、关键点

向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);