简介
首先,map容器中所有元素都是成对出现的,其中第一个元素为key,起到索引的作用,会自动按照key值的大小排序;第二个语速为value,用于存放值。其中map的key值不可重复,而multimap的key值可以重复。
map属于关联式容器,其底层结构是二叉树。
1.遍历
迭代器遍历
void PrintfMap(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;
}
2.创建
Map中中常用创建方法有三种:
1.默认创建
map<ElemType1,ElemType2> m1;
m1.insert(pair<ElemType1,ElemType2>(key1,value1));
m1.insert(pair<ElemType1,ElemType2>(key2,value2));
2.拷贝创建
map<ElemType1,ElemType2> m2(m1);
3.重载等号赋值创建
map<ElemType1,ElemType2> m3;
m3=m1;
实例:
//02创建
void test02()
{
map<int,int>m1;
m1.insert(pair<int,int>(21,201));
m1.insert(pair<int,int>(22,202));
m1.insert(pair<int,int>(23,203));
m1.insert(pair<int,int>(24,204));
PrintfMap(m1);
map<int,int> m2(m1);
PrintfMap(m2);
map<int,int> m3;
m3=m1;
PrintfMap(m3);
}
运行结果图:
3.增加元素
Map中常用的有以下两种插入元素的方法,其得到的结果是一样的:
m.insert(pair<int,int>(1,10));
m.insert(make_pair(1,10));
实例:
//03增加元素
void test03()
{
map<int,int>m0;
m0.insert(pair<int,int>(31,301));
m0.insert(pair<int,int>(32,302));
m0.insert(pair<int,int>(33,303));
m0.insert(make_pair(34,304));
m0.insert(make_pair(35,305));
m0.insert(make_pair(36,306);
PrintfMap(m0);
}
运行结果图:
4.删除元素
Map中删除元素主要使用erase函数。
m.erase(it); //删除迭代器it所指的元素,并返回下一个元素的迭代器。
m.erase(key1); //删除key值为key1的元素
m.erase(it1,it2); //删除迭代器it1到it2所指区间内的所有元素,并返回下一个元素的迭代器。
实例:
//04删除
void test04()
{
map<int,int>m0;
m0.insert(pair<int,int>(41,401));
m0.insert(pair<int,int>(42,402));
m0.insert(pair<int,int>(43,403));
m0.insert(pair<int,int>(44,404));
m0.insert(pair<int,int>(45,405));
m0.insert(pair<int,int>(46,406));
PrintfMap(m0);
//第一种删除方法
m0.erase(m0.begin());
PrintfMap(m0);
//第二种删除方法
m0.erase(46);
PrintfMap(m0);
//第三种删除方法
m0.erase(m0.begin(),m0.end());
PrintfMap(m0);
}
运行结果图:
5.修改元素和交换容器
map集合中没有给定的修改数据的函数。
在集合中一个key只能对应一个value,所以当在map中添加相同的key,会覆盖已有的相同key的值,从而达到修改数据的效果。
Map中交换容器使用swap()函数。
m.swap(m1);
实例:
//05更改元素和交换容器
void test05()
{
cout<<"交换前m1,m2分别为:"<<endl;
map<int,int>m1;
m1.insert(pair<int,int>(1,10));
m1.insert(pair<int,int>(2,20));
m1.insert(pair<int,int>(3,30));
m1.insert(pair<int,int>(4,40));
PrintfMap(m1);
map<int,int>m2;
m2.insert(pair<int,int>(50,501));
m2.insert(pair<int,int>(50,502));
m2.insert(pair<int,int>(50,503));
m2.insert(pair<int,int>(50,504));
PrintfMap(m2);
cout<<"更改m1为:"<<endl;
m1.insert(pair<int,int>(6,60));
PrintfMap(m1);
m1.swap(m2);
cout<<"交换后m1,m2分别为:"<<endl;
PrintfMap(m1);
PrintfMap(m2);
}
运行结果图;
7.查找元素
6.判空和计算容量
Map中判空用empty()函数,非空字符串或者非零,则返回 false ,反之返回 true。
m.empty();
Map中计算容量用size()函数,返回元素个数。
m.size();
实例:
//06判空,容量
void test06()
{
map<int,int>m0;
m0.insert(pair<int,int>(61,601));
m0.insert(pair<int,int>(62,602));
m0.insert(pair<int,int>(63,603));
m0.insert(pair<int,int>(64,604));
m0.insert(pair<int,int>(65,605));
m0.insert(pair<int,int>(66,606));
if(m0.empty()==0)
{
cout<<"m0非空"<<endl;
cout<<"m0中元素个数为"<<m0.size()<<endl;
}
}
运行结果图;
7.查找
Map中查找使用find()函数,通过键值key查找对应的值。若存在,返回该键值对应元素值的迭代器,否者返回.end()。
m.find(key);
实例:
//07查找
void test07()
{
map<int,int>m0;
m0.insert(pair<int,int>(71,701));
m0.insert(pair<int,int>(72,702));
m0.insert(pair<int,int>(73,703));
m0.insert(pair<int,int>(74,704));
m0.insert(pair<int,int>(75,705));
m0.insert(pair<int,int>(76,706));
map<int,int>::iterator it=m0.find(74);
if(it==m0.end())
{
cout<<"未查找到该键值对应的元素"<<endl;
}
else cout<<"该键值对应的元素为:"<<it->second<<endl;
}
运行结果图:
8.统计(常用于multimap)
Map中使用count()函数统计键值对应的元素个数,Map中只会返回0或1;Multimap会返回一个常数。
m.count(key);
实例:
//08统计(常用于multimap)
void test08()
{
multimap<int,int> m0;
m0.insert(pair<int,int>(81,801));
m0.insert(pair<int,int>(81,802));
m0.insert(pair<int,int>(83,803));
m0.insert(pair<int,int>(84,804));
m0.insert(pair<int,int>(81,805));
m0.insert(pair<int,int>(86,806));
int num=m0.count(81);
cout<<"键值81对应的元素有: "<<num<<" 个"<<endl;
}
运行结果图:
9.清空
使用clear()函数清空容器。
m.clear();
实例:
//09清空
void test09()
{
map<int,int>m0;
m0.insert(pair<int,int>(91,901));
m0.insert(pair<int,int>(92,902));
m0.insert(pair<int,int>(93,903));
m0.insert(pair<int,int>(94,904));
m0.insert(pair<int,int>(95,905));
m0.insert(pair<int,int>(96,906));
cout<<"m0中元素个数为"<<m0.size()<<endl;
PrintfMap(m0);
m0.clear();
cout<<"清空后m0中元素个数为"<<m0.size()<<endl;
}
运行结果图:
10.所有实例源代码
#include<iostream>
#include<map>
using namespace std;
void PrintfMap(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;
}
//02创建
void test02()
{
map<int,int>m1;
m1.insert(pair<int,int>(21,201));
m1.insert(pair<int,int>(22,202));
m1.insert(pair<int,int>(23,203));
m1.insert(pair<int,int>(24,204));
PrintfMap(m1);
map<int,int> m2(m1);
PrintfMap(m2);
map<int,int> m3;
m3=m1;
PrintfMap(m3);
}
//03增加元素
void test03()
{
map<int,int>m0;
m0.insert(pair<int,int>(31,301));
m0.insert(pair<int,int>(32,302));
m0.insert(pair<int,int>(33,303));
m0.insert(make_pair(34,304));
m0.insert(make_pair(35,305));
m0.insert(make_pair(36,306));
PrintfMap(m0);
}
//04删除元素
void test04()
{
map<int,int>m0;
m0.insert(pair<int,int>(41,401));
m0.insert(pair<int,int>(42,402));
m0.insert(pair<int,int>(43,403));
m0.insert(pair<int,int>(44,404));
m0.insert(pair<int,int>(45,405));
m0.insert(pair<int,int>(46,406));
PrintfMap(m0);
//第一种删除方法
m0.erase(m0.begin());
PrintfMap(m0);
//第二种删除方法
m0.erase(46);
PrintfMap(m0);
//第三种删除方法
m0.erase(m0.begin(),m0.end());
PrintfMap(m0);
}
//05更改元素和交换容器
void test05()
{
cout<<"交换前m1,m2分别为:"<<endl;
map<int,int>m1;
m1.insert(pair<int,int>(1,10));
m1.insert(pair<int,int>(2,20));
m1.insert(pair<int,int>(3,30));
m1.insert(pair<int,int>(4,40));
PrintfMap(m1);
map<int,int>m2;
m2.insert(pair<int,int>(50,501));
m2.insert(pair<int,int>(50,502));
m2.insert(pair<int,int>(50,503));
m2.insert(pair<int,int>(50,504));
PrintfMap(m2);
cout<<"更改m1为:"<<endl;
m1.insert(pair<int,int>(6,60));
PrintfMap(m1);
m1.swap(m2);
cout<<"交换后m1,m2分别为:"<<endl;
PrintfMap(m1);
PrintfMap(m2);
}
//06判空,容量
void test06()
{
map<int,int>m0;
m0.insert(pair<int,int>(61,601));
m0.insert(pair<int,int>(62,602));
m0.insert(pair<int,int>(63,603));
m0.insert(pair<int,int>(64,604));
m0.insert(pair<int,int>(65,605));
m0.insert(pair<int,int>(66,606));
if(m0.empty()==0)
{
cout<<"m0非空"<<endl;
cout<<"m0中元素个数为"<<m0.size()<<endl;
}
}
//07查找
void test07()
{
map<int,int>m0;
m0.insert(pair<int,int>(71,701));
m0.insert(pair<int,int>(72,702));
m0.insert(pair<int,int>(73,703));
m0.insert(pair<int,int>(74,704));
m0.insert(pair<int,int>(75,705));
m0.insert(pair<int,int>(76,706));
map<int,int>::iterator it=m0.find(74);
if(it==m0.end())
{
cout<<"未查找到该键值对应的元素"<<endl;
}
else cout<<"该键值对应的元素为:"<<it->second<<endl;
}
//08统计(常用于multimap)
void test08()
{
multimap<int,int> m0;
m0.insert(pair<int,int>(81,801));
m0.insert(pair<int,int>(81,802));
m0.insert(pair<int,int>(83,803));
m0.insert(pair<int,int>(84,804));
m0.insert(pair<int,int>(81,805));
m0.insert(pair<int,int>(86,806));
int num=m0.count(81);
cout<<"键值81对应的元素有: "<<num<<" 个"<<endl;
}
//09清空
void test09()
{
map<int,int>m0;
m0.insert(pair<int,int>(91,901));
m0.insert(pair<int,int>(92,902));
m0.insert(pair<int,int>(93,903));
m0.insert(pair<int,int>(94,904));
m0.insert(pair<int,int>(95,905));
m0.insert(pair<int,int>(96,906));
cout<<"m0中元素个数为"<<m0.size()<<endl;
PrintfMap(m0);
m0.clear();
cout<<"清空后m0中元素个数为"<<m0.size()<<endl;
}
int main()
{
//
//test02();
//
//test03();
//
//test04();
//
//test05();
//
//test06();
//
//test07();
//
//test08();
//
//test09();
return 0;
}