您的位置:首页 > 编程语言 > C语言/C++

【学习C++】Map使用

2017-12-07 21:45 197 查看
记录一些我遇到过,但是没有真正记住的C++知识

Map

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

1.若用insert语句插入相同的key值时,第二次进行插入的操作会失败,(而用数组会覆盖)

几种不同的插入方式:
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: