1、map中的所有元素都是pair
2、pair中第一个元素为key(键值)起到了索引作用,第二种元素为value(实值)
3、所有元素都会根据元素的键值自动排序
本质:
map/multimap属于关联式容器,底层结构是用二叉树实现
优点:
可以根据键值快速找到value值
map与multimap的区别:
map不允许容器中有重复的key值元素
map构造和赋值
构造:
map<T1,T2> mp; //map默认构造函数
map<const map &mp> //拷贝构造函数
赋值:
map& operator=(const map &mp) //重载等号操作符
示例:
#include<map>
//打印容器中的数据
void printMap(map<int,int>&m){
for(map<int,int>::iterator it = m.begin();it!=m.end();it++){
cout<<"序号key为: "<<it->first<<" 实际value值:"<<(*it).second<<endl;
}
cout<<endl;
}
//map容器 构造和赋值
void test01(){
//创建map容器
map<int,int> m; //默认构造函数
//向map中插入数据,map中的每一个元素都是一个对组
m.insert(pair<int,int>(2,10));
m.insert(pair<int,int>(1,20));
m.insert(pair<int,int>(4,30));
m.insert(pair<int,int>(3,40));
printMap(m) ;
//拷贝构造函数
map<int,int> mp(m);
printMap(mp);
//赋值操作
map<int,int>m1;
m1 = m;
printMap(m1);
}
输出样式:
map大小和交换
函数原型:
size(); //返回容器的元素数目
empty(); //判断容器是否为空
swap(st) //交换两个集合容器
示例:
//容器大小
cout<<"Map容器m的大小为: "<<m.size()<<endl;
//容器是否为空
if(m.empty()){
cout<<"m容器为空"<<endl;
}
else{
cout<<"m容器不为空"<<endl;
}
//交换
map<int,int>m2;
m2.insert(pair<int,int>(6,600));
m2.insert(pair<int,int>(7,700));
m2.insert(pair<int,int>(8,800));
m2.insert(pair<int,int>(9,900));
cout<<" 交换前m容器中有: "<<endl ;
printMap(m);
cout<<" 交换前m2容器中有: "<<endl ;
printMap(m2);
cout<<"------------------------ "<<endl;
m.swap(m2);//交换
cout<<"交换后m容器中有: "<<endl;
printMap(m);
cout<<"交换后m2容器中有: "<<endl;
printMap(m2);
输出样式:
Map的插入和删除
函数原型:
insert(elem); //容器中插入元素
clear(); //清除所有元素
erase(pos);//删除pos迭代器的所指元素,返回下一个元素的迭代器
erase(beg,end);//删除区间[beg,end]的所有元素,返回下一个元素的迭代器
erase(key); //删除容器中值为key的元素
示例:
//map容器插入和删除
void test01(){
//创建map容器
map<int,int> m; //默认构造函数
//第一种插入方式:向map中插入数据,map中的每一个元素都是一个对组
m.insert(pair<int,int>(2,10));
m.insert(pair<int,int>(1,20));
m.insert(pair<int,int>(4,30));
m.insert(pair<int,int>(3,40));
// 第二种插入方式
m.insert(make_pair(5,50));
//第三中插入方式
m.insert(map<int,int>::value_type(6,60));
//第四种插入方式,不推介使用,一般用于key去访问到value
m[7]=70;
printMap(m) ;
//创建键值为8的元素,元素默认value为0
cout<<m[8]<<endl;
//删除
m.erase(3);//按照key值来删除
printMap(m);
//按区间删除
cout<<"-------按key值区间删除后-----------"<<endl;
m.erase(++m.begin(),--m.end());
printMap(m);
//按元素删除
cout<<"-------按key值删除后-----------"<<endl;
m.erase(1);
printMap(m);
//清空容器
cout<<"-------清空后-----------"<<endl;
m.clear();
printMap(m);
}
输出样式:
map的查找和统计
函数原型:
find(); //查找key是否存在,若存在,返回该键的元素的迭代器,若不存在,返回set.end();
cout(key); //统计key的元素个数
示例:
//查找
map<int,int>::iterator pos = m.find(1);
if(pos!=m.end()){
cout<<"查到了元素 key = "<<(*pos).first<<" value = "<<pos->second<<endl;
}
else{
cout<<"没有查到该元素"<<endl;
}
//统计
int num = m.count(2);
cout<<"num = "<<num<<endl;
输出样式:
map的排序:
主要掌握map默认的排序规则是从小到大的排序规则,我们需要修改他的排序规则,主要利用仿函数的技术
示例:
class MyCompare{
public:
bool operetor()(int v1,int v2){
//降序
return v1>v2;
}
};
//map容器排序
void test01(){
map<int,int,MyCompare> m; //默认构造函数
m.insert(pair<int,int>(1,10));
m.insert(pair<int,int>(2,20));
m.insert(make_pair(3,30));
m.insert(make_pair(4,40));
m.insert(make_pair(5,50));
for(map<int,int,MyCompare>::iterator it = m.begin();it!=m.end();it++){
cout<<"key = "<<it->first<<" value = "<<it->second<<endl ;
}
}
输出样式: