map详解
Posted qq2210446939
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了map详解相关的知识,希望对你有一定的参考价值。
简述:
map是stl的一种关联式容器,提供一对一的数据存储结构,第一个成为关键字,第二个为该关键字的值,在map中关键字只能出现一次。map的内部为一棵红黑树,具有自动排序功能,map会根据key值的大小进行非降序排序,当key值类型为string时为字典序。在map中查找插入删除的时间复杂度都是logn。
定义:
map<string,int> ma;//<key类型,val类型> map<string,int>::iterator it;//迭代器
插入数据:
insert函数:
typedef pair<string,int> paa; ma.insert(paa{"ab",1});
但在同一个key值val不同时,insert只会生效第一次,所以用数组进行插入更优:
ma["ab"]=1; ma["ab"]=2; cout<<ma["ab"];//会输出2
容量:
ma.size(); map已经存在的映射数目
ma.clear(); 清空容器
ma.empty(); 判空
迭代器参考位置:
ma.begin(); 初始位置迭代器
ma.end(); 末尾位置+1迭代器
ma.rbegin(); 逆序迭代器初始位置,即数据末尾元素位置
ma.rend(); 逆序迭代器终止位置,即元素初始位置-1
查询:
ma.count(x); x作为key值是否在map中出现,出现返回1
ma.find(x); 在map中查找作为key的x,找到返回迭代器位置,找不到返回ma.end();
ma.lower_bound(x); 查找作为key的x,返回第一个大于等于的迭代器位置,找不到同上
ma.upper_bound(x); 查找作为key的x,返回第一个大于的迭代器位置,找不到同上
遍历:
//迭代器方式 for(it=ma.begin();it!=ma.end();it++){ cout<<it->first<<" "<<it->second<<endl; }
ma[1]="ab"; ma[2]="abc"; //数组方式 for(int i=1;i<=2;i++){ cout<<ma[i]<<" "; }
这种方式只适用于key是整数类型,且连续才能用for遍历
删除:
通过key值删除:
ma.erase(2);//删除key值为2的映射
通过迭代器删除:
it=ma.find(2); ma.erase(it);
注意在循环中ma.erase(it);会使迭代器失效,c++11会返回下一个迭代器位置可c++98就必须写成ma.erase(it++);
之前说到map会自动根据key值排序,当我们将key的类型设置为结构体时,就要重载运算符了:
struct node{ int x,y; bool operator<(const node b)const { return this->x<b.x; } }a[50];
以上是关于map详解的主要内容,如果未能解决你的问题,请参考以下文章