C++STL map/multimap基础知识总结

简介

  首先,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);	
}

运行结果图:

4d6c76ab22574fa7a5160bf0b19c12f9.png

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);		
}

运行结果图:

6a3b909529c8454a87fd7dd21f372c7d.png

 

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);
}

运行结果图:

92c3dc7041b44e99b5e8cd2815640d4f.png

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);	
}

运行结果图;

aff5d30c2e014cee92c4802e50576840.png

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;
	}
}

运行结果图;

a978728784e3442cb98fd97fb4d5a41a.png

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;	
}

运行结果图:

e60f87a3b97343fd874e0170188d2ac6.png

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;
	
}

运行结果图:

62172e36b47a4d7f8172f011b91d26b8.png

 

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;
}

运行结果图:

674b8fde53244018887047ace358bd77.png

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;
}

 

 

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

早点睡嘛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值