记录一些我遇到过,但是没有真正记住的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;
}