c++关联容器概述

一、关联容器

关联容器支持高效的关键字查找和访问,两个主要的关联容器类型是map和set

标准库提供以下8个关联容器:

按关键字有序保存元素
map关联数组:保存关键字-值对
set关键字即值,只保存关键字的容器
multimap关键字可重复出现的map
multiset关键字可重复出现的set
无序集合
unordered_map用哈希函数组织的map
unordered_set用哈希函数组织的set
unordered_multimap哈希函数组织的关键字可重复出现的map
unordered_multiset哈希函数组织的关键字可重复出现的set

二、定义关联容器

1、定义一个map时,必须既指明关键字类型又指明值类型;而定义一个set时,只需指明关键字类型,因为set中没有值,故set可以用另一个同类型的容器或者从一个值范围来初始化

2、对于multimap和multiset同样,不过允许出现重复的关键字

vector<int>vec{ 1,5,3,4,4,4,4 };
map<int, int>mp;
set<int>st(vec.begin(), vec.end());
multiset<int>mst(vec.begin(), vec.end());

三、按关键字排序

1、对于有序容器,关键字类型必须定义元素比较的方法,默认情况下,标准库使用关键字类型的<运算符来比较两个关键字(因此自定义的结构体作为关键字时需要注意)

2、用来组织一个容器中元素的操作的类型也是该容器类型的一部分,为了指定使用自定义的操作,必须在定义关联容器类型时提供此操作的类型

3、STL标准库中,包含几个可供关联式容器使用的排序规则

排序规则功能
std::less<T>底层采用 < 运算符实现升序排序,各关联式容器默认采用的排序规则
std::greater<T>底层采用 > 运算符实现降序排序,同样适用于各个关联式容器
std::less_equal<T>底层采用 <= 运算符实现升序排序,多用于 multimap 和 multiset 容器
std::greater_equal<T>底层采用 >= 运算符实现降序排序,多用于 multimap 和 multiset 容器

4、具体写法如下:

标准库类型:

bool cmp(const int& a, const int& b)
{
	return a > b;
}
set<int, decltype(cmp)*>st(cmp);
map<int, int, decltype(cmp)*>mp(cmp);
//或者
struct cmp
{
	bool operator()(const int& a, const int& b)const
	{
		return a > b;
	}
};
set<int, cmp>st;
map<int, int, cmp>mp;
//或者
map<int,int, greater<int>>mp;    //标准库中的比较函数
multiset<int, greater_equal<int>>st;

自定义类:

struct node
{
	int y;
	string s;
};
bool cmp(const node& a, const node& b)
{
	return a.y > b.y;
}
set<node, decltype(cmp)*>st(cmp);
map<node,int, decltype(cmp)*>mp(cmp);
//或者
struct node
{
	int y;
	string s;
	friend bool operator<(const node& a, const node& b)
	{
		return a.y > b.y;
	}
};
set<node>st;
map<node,int>mp;

四、pair类型

1、pair保存两个数据成员,类似容器,pair是一个用来生成特定类型的模板,类似于一个只有两个成员的结构体(类)

2、pair上的操作

pair<T1, T2> p;			//p是一个pair,两个类型分别为T1和T2的成员都进行了值初始化
pair<T1, T2> p(v1, v2);	    //first和second成员分别用v1和v2进行初始化
pair<T1, T2> p = { v1,v2 };	//等价于p(v1, v2)
make_pair(v1, v2);		//返回一个用v1和v2初始化的pair,pair的类型从v1和v2的类型推断出来
p.first;	p.second;	//返回p的名为firs、second的(公有)数据成员
p1 relop p2;		   // 关系运算符(<、>、 <= 、 >= )按字典序定义
p1 == p2; p1 != p2;    //相等性判断利用元素的 == 运算符实现

五、关联容器额外的类型别名

对于set类型,key_type,value_type是一样的,set的值就是关键字

对于map类型,元素是关键字-值对,每个元素是一个pair对象,由于不能改变关键字部分,故为const类型

我们用作用域运算符来提取一个类型的成员

key_type        //map容器的关键字的类型
mapped_type     //每个关键字对应的值的类型
value_type      //对于map为pair<const key_type,mapped_type>,对于set即key_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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值