关联容器

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

 

 

 

 

以上是关于关联容器的主要内容,如果未能解决你的问题,请参考以下文章

片段未与片段管理器关联。 (对话片段)

将Android片段移动到不同的容器无法更改片段的容器ID

ViewPager 中的片段没有与之关联的活动

片段中的 super.onCreateView

如何在 Android 中的特定片段容器中显示片段

尝试将片段添加到我的片段容器 FrameLayout