11.2 关联容器概述


关联容器(有序的和无序的)都支持9.2节中介绍的普通容器操作。

关联容器的迭代器都是双向的。

定义关联容器

对于map 、set的初始化

	map<string, int> word_count;  //空map
	set<string> limit2;           //空set
	set<string> limit = { "the","a","an" };//具有初始化的set
	map<string, int> word_count2 = { {"张三",11},{"李四",12},{"王五",13} };//具有初始化的map,注意的是类型需要一一对应

对于map来说,实际上一个元素是{key,value}

初始化multimap和multiset

与map和set相比,multimap和multiset允许多个元素具有相同关键字,其他的是一致的。

关键字类型的要求

对于有序关联容器,关键字类型中必须定义元素比较方法,默认使用"<"运算符。如果自定义操作代替<运算符,必须在关键字类型上定义一个严格弱序。

也即当没有传入顺序要求,则默认对有序关联容器当中的数据进行key或者set的元素<比较,进行排列座次。

严格弱序:假定这种顺序是小于等于,那么对于不同的关键字,不可能互相小于等于或循环小于等于。如果两个关键字都不小于等于另一个,则而这等价,看作同一关键字。

使用比较函数进行有序关联容器的定义

对于没有<操作符的类,可以自定义比较操作,此时在定义有序容器时,自定义操作类型在尖括号中紧跟着元素类型给出

	//注意此处的a b 的类型只能是和有序关联容器中存储的一致。
	bool compID(int a, int b) {
		return a < b;
	};
	multiset<int, decltype(compID)*>student(compID);
	//multiset<int, bool(*)(int a, int b)>student(&compID); //相当于

pair类型

一个pair保存两个数据成员,是用来生成特定类型的模板。

头文件:

#include<utility>

默认构造函数对数据成员进行值初始化
可以提供列表初始化

基本操作:

操作说明
pair<T1, T2> p;p是一个pair,两个类型分别为T1,T2的成员同时进行了值初始化
pair<T1,T2> p(v1,v2)p是一个成员类型为T1和T2的pair,v1和v2分别对其first和second进行了初始化
make_pair(v1,v2);返回用v1,v2初始化的pair。pair类型通过v1,v2推断出来。
p.first返回p的first(公有)成员
p.second返回p的second(公有)成员
p1 关系运算符(除了等于和不等于)p2关系运算符(<、>、<=、>=)按字典序定义:举个例子:判断p1<p2:等效于判断(p1.first和p2.first)和(p1.second和p2.second)之间只需要有一组满足<即可。
p1 == p2以及p1 != p2需要first和second都相等p1才等于p2,剩下即为不等
pair<string, int> process(vector<string>& v) {
	if (!v.empty()) 
	{
		return { v.back(),v.back().size()};
		//早期需要显式构造
		//return pair<string, int>(v.back(), v.back().size());
		//return make_pair(v.back(), v.back().size());
	}
	else {
		return pair<string, int>();
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值