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);                  查找作为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];

 

 

 

 

  

posted @ 2020-03-12 14:04  艾尔夏尔-Layton  阅读(523)  评论(0编辑  收藏  举报