【学习C++】Map使用

记录一些我遇到过,但是没有真正记住的C++知识

##Map

stl中的一个二元组容器(key->value),不允许key值重复。其底层实现原理为红黑树,其插入查找删除的效率综合而言相对高于AVL.

1.若用insert语句插入相同的key值时,第二次进行插入的操作会失败

而用m[key]=value方式插入会覆盖

几种不同的插入方式:
map<unsigned int, int>Map;
Map.insert(make_pair<unsigned int, int>(23, 2));
Map.insert(map<unsigned int, int>::value_type(150, 2));
Map.insert(pair<unsigned int, int>(30, 2));
//其中insert返回bool型显示操作是否成功
2.了解容器的迭代器

首先容器的区间是左闭右开的,区间是以空位置作为结束的,下图显示了正向迭代器和反向迭代器之间的区别和相同之处。

这里写图片描述

首先正向迭代器的指向与用指针运算符操作的内存是一致的,而对于反向迭代器,由于遵守了区间以空位置为结束的规定,则rbegin()指向了end()也指向的内存,但这一块区域是未知的,所以在进行指针运算操作时作用于前一块内存。
需要注意的是:若指向值未知的内存,会显示错误

例如下代码:

map<unsigned int, int>::iterator i = Map.end();
cout << i->first << endl;

显示如下错误:
这里写图片描述

3.利用find()函数查找某个键值是否存在,若不存在返回迭代器Map.end(),存在返回该键所在位置的迭代器
map<unsigned int, int>::reverse_iterator i = Map.find(2);/报错 find返回的是正向的迭代器
map<unsigned int, int>::iterator it = Map.find(20);
if (it != Map.end()) {cout << "找到" << endl;}
else if((++it)!=Map.end()){
	cout << "下一个"<<it->first << endl;//要先判断是否越界再进行访问
}

		
		
4.lower_bound(key)与upper_bound(key)

map::lower_bound(key):返回map中第一个大于或等于key的迭代器指针
map::upper_bound(key):返回map中第一个大于key的迭代器指

在具体情况下利用upper_bound(key)函数实则是想找到在Map容器内比key值大中最小的位置。下面两段代码思想可用于电梯调度的算法。

	map<unsigned int, int>::iterator i = Map.upper_bound(155);//155 160
	//upper找到比key值大的第一个元素所在位置
	//正向查找离key值最近的元素
	if (i == Map.end())
	{
		cout << "未找到!" << endl;
		//这里利用了反向迭代器指向正向迭代器的前一个位置
		//未找到反向查找
		map<unsigned int, int>::reverse_iterator ri(i);
		cout << ri->first << endl;
	}
	else {
		cout << i->first << endl;
	}
	

		map<unsigned int, int>::iterator it = Map.upper_bound(25);//15 25
	if (it == Map.begin())
	{
		cout << "没有找到比15更小的" << endl;
		cout << it->first << endl;
	}
	else {
			map<unsigned int, int>::reverse_iterator ri(it);
			cout << ri->first << endl;
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值