一、头文件
#include<map>
map是一种以键--值(key-value)存储的数据类型
map中的数据默认按照key的值从小到大排序,value若为Int类型,默认为0
map不允许容器中有重复key值元素。
multimap允许容器中有重复key值元素
二,定义
构造函数原型:
map<T1,T2> m;//默认构造函数
map(const map &m);//拷贝构造函数
map& operator=(const map &m);//重载等号操作符
示例如下:
1)map<int,string> m;//定义了一个空的对象m
2)map<string,vector<string>> m;//
3)map<int,int> m;
map<int,int> m2=m;
三、常用操作
1)插入元素
常用的插入方式是m[key]=value;
如果是map<int,vector<int>> m;
可以使用m[key]={0,1,2};//这种方式
示例如下:
map<int,int> m1;
m1.insert({1,10});
m1.insert({2,20});
m1.insert({3,30});
m1.insert({4,40});
m1[5]=50;
m1[6]=60;
2)删除
erase(pos);//删除pos迭代器所指的元素,返回下一个元素的迭代器
erase(begin,end);//删除区间[begin,end)的元素,返回下一个元素的迭代器
erase(key);//删除容器中值为key的元素
clear();//删除所有元素
示例如下:
map<int,int> m1;
m1.insert({1,10});
m1.insert({2,20});
m1.insert({3,30});
m1.insert({4,40});
m1[5]=50;
m1[6]=60;
m1.erase(m1.begin());//0,20,30,40,50,60
auto it=m1.find(3);
m1.erase(m1.begin(),it);//0,0,30,40,50,60
m1.clear();//删除所有元素
3)查找和统计
find(val);//查找val是否存在,若存在,返回该键的迭代器,不存在,返回m.end();
count(val);//统计val的个数
map<int,int> m1;
m1.insert({1,10});
m1.insert({2,20});
m1.insert({3,30});
m1.insert({4,40});
m1[5]=50;
m1[6]=60;
auto it=m1.find(3);
cout<<it->first<<" "<<it->second<<endl;//3,20
cout<<m1.count(3)<<endl;//1
4)遍历
设map<int,int> m
则遍历如下:
map<int,int>::iterator iter=m.begin();
while(iter!=m.end())
{
cout<<iter->first<<" "<<iter->second<<endl;//输出
iter++;
}
使用auto遍历
for(auto iter=m.begin();iter!=m.end();iter++)
{
cout<<iter->first<<" "<<iter->second<<endl;
}
for(auto &v:m)
{
cout<<v->first<<v.second<<endl;
}
map<int,vector<int>> m;
使用auto遍历
for(auto &[_,v]:m)
{
cout<<v[0]<<endl;
cout<<v[1]<<endl;
//可以对vector进行操作
}
5)大小与交换
size();//返回容器中的元素数目
empty();//判断容器是否为空
swap(m2);//交换2个容器的元素
示例如下:
map<int,int> m1;
m1.insert({1,10});
m1.insert({2,20});
m1.insert({3,30});
m1.insert({4,40});
cout<<m1.size()<<endl;//4
cout<<m1.empty()<<endl;//0
map<int,int> m2;
m2.insert({6,10});
m2.insert({7,30});
m2.swap(m1);
6)排序
map默认按照key值从小到大排序,可以利用仿函数改变排序规则
第一种方式:使用仿函数
示例1:使用内置数据类型
class compare
{
public:
bool operator()(int v1,int v2)
{
return v1>v2;
}
};
map<int,int,compare> m1;
m1.insert({1,10});
m1.insert({2,20});
m1.insert({3,30});
for(auto it=m1.begin();it!=m.end();it++)
cout<<it->first<<" "<<it->second<<endl;
//输出3,30 2,20 1, 10
示例2:使用自定义数据类型
class student{
public:
int age;
string name;
student(int ag,string nam)
{
age=ag;
name=nam;
}
};
class compare
{
public:
bool operator()(const student& s1,const student& s2) const
{
return s1.age>s2.age;
}
};
int main()
{
map<student,char,compare> m1;
student t1(1,"h1");
student t2(2,"h2");
student t3(3,"h3");
m1[t1]='a';
m1.insert({t2,'b'});
m1.insert({t3,'c'});
for(auto it=m1.begin();it!=m1.end();it++)
cout<<it->first.age<<" "<<it->first.name<<" "<<it->second<<endl;
return 0;
}
输出为:
3 h3 c
2 h2 b
1 h1 a
注意:自定义排序规则时,无论是传递参数,还是整个函数的const都必须写上
第二种方式:重载operator<()操作符
直接在定义类中重载operator<()操作符。
示例如下:
class student{
public:
int age;
string name;
student(int age,string name)
{
this->age=age;
this->name=name;
}
bool operator<(const student &s) const
{
return age>s.age;
}
};
int main()
{
map<student,char> m1;
student t1(1,"h1");
student t2(2,"h2");
student t3(3,"h3");
m1[t1]='a';
m1.insert({t2,'b'});
m1.insert({t3,'c'});
for(auto it=m1.begin();it!=m1.end();it++)
cout<<it->first.age<<" "<<it->first.name<<" "<<it->second<<endl;
return 0;
}
输出为:
3 h3 c
2 h2 b
1 h1 a
自定义排序规则还有几种方式,可以额外了解一下。