C++标准模板库(STL)之map常见用法详解

map可以翻译为映射,可以将任何基本类型映射到任何基本类型。

使用前提条件:

需要添加map头文件#include,还需要加上using namespace std;

总结:map的常见用途

(1)需要建立字符或者字符串与整数之间映射的题目

(2)判断大整数或者其他类型的数据是否存在的题目,可以把map当bool数组使用

(3)字符串和字符串的映射

延伸:map的键和值是唯一的,而如果一个键需要对应多个值,只能使用multimap.

1.map的定义

map需要映射前的类型(键key)和映射后的类型(值value)

所以括号里填写两个类型,第一个是key,第二个是value

mapmp;

如果是int型映射到int型,那就是普通的int型数组

如果是字符串到整型的映射,必须使用string而不能使用char

字符的话,可以是char

map mp;

 map的key和value也可以是STL容器,可以将一个set容器映射到一个字符串;

map,string> mp;

2.map容器内元素的访问

(1)通过下标访问

#include
#include
#include
#include
#include
using namespace std;
int main(){
	map mp;
	mp['c']=20;              //20会被覆盖
	mp['c']=30;
	printf("%d",mp['c']);
	return 0;
	
} 

C++标准模板库(STL)之map常见用法详解_第1张图片

(2)通过迭代器访问

map::iterator it;

typename1和typename2就是定义map时填写的类型,这样就得到了迭代器it

因为map的每一对映射都有两个typename,这决定必须能只用一个it 来同时访问键和值。事实上,map可以使用it->first来访问键,用it->second来访问值。

#include
#include
#include
using namespace std;
int main(){
	map mp;
	mp['c']=20;
	mp['a']=40;
	mp['r']=60;
	map::iterator it=mp.begin();
	for(;it!=mp.end();it++){
		printf("%c %d\n",it->first,it->second);
	}
	return 0;
}
	

C++标准模板库(STL)之map常见用法详解_第2张图片

有趣的现象就是: map会以键从小到大的顺序自动排序,这是由于map内部是使用红黑树实现的(set也是).

3.map常用函数实例解析

(1)find()

         find(key)返回键为key的映射的迭代器

#include
#include
#include
#include
#include
using namespace std;
int main(){
	map mp;
	mp['c']=20;
	mp['a']=40;
	mp['r']=60;
	map::iterator it=mp.find('a');
		printf("%c %d\n",it->first,it->second);
	return 0;
}
	
	

C++标准模板库(STL)之map常见用法详解_第3张图片

(2)erase()有两种用法

         ①删除单个元素   mp.erase(it),it为要删除的元素的迭代器

#include
#include
#include
#include
#include
using namespace std;
int main(){
	map mp;
	mp['c']=20;
	mp['a']=40;
	mp['r']=60;
	map::iterator it=mp.find('a');
	mp.erase(it);
	for(map::iterator it=mp.begin();it!=mp.end();it++){
		printf("%c %d\n",it->first,it->second);
	}	
	return 0;
}

C++标准模板库(STL)之map常见用法详解_第4张图片

注意:这里的for 循环的初始条件一定要从map::iterator it=mp.begin()开始,不能像输出所有元素那样直接用  ;  代替,之所以人家能用是因为人家一开始的条件就是map::iterator it=mp.begin(),但是此时我们的出事条件是找出要删除的那个元素map::iterator it=mp.find('a');

      ①(2)还可以用mp.erase(key),key为要删除的映射的键。

#include
#include
#include
#include
#include
using namespace std;
int main(){
	map mp;
	mp['c']=20;
	mp['a']=40;
	mp['r']=60;	
	mp.erase('a');     //简单粗暴,直接爆头
	for(map::iterator it=mp.begin();it!=mp.end();it++){
		printf("%c %d\n",it->first,it->second);
	}	
	return 0;
}

C++标准模板库(STL)之map常见用法详解_第5张图片

    ②删除一个区间内的所有元素    mp.erase(first,last),注意还是左闭右开噢!

#include
#include
#include
#include
using namespace std;
int main(){
	map mp;
	mp['c']=20;
	mp['a']=40;
	mp['r']=60;
	map::iterator it=mp.find('a');
	mp.erase(it,mp.end());
	for(map::iterator it=mp.begin();it!=mp.end();it++){
		printf("%c %d\n",it->first,it->second);
	}	
	return 0;
}

C++标准模板库(STL)之map常见用法详解_第6张图片

这是为什么呢?不是应该还剩下c,按理说应该输出 c  20  吗?

注意噢:删除的时候也是排好序才开始删的噢!就是 a  c  r  排好之后才定位a的噢!

再看,把删除起始元素换一下。。。。换成cC++标准模板库(STL)之map常见用法详解_第7张图片

(3)size() 用来获取map中映射的对数

#include
#include
#include
using namespace std;
int main(){
	map mp;
	mp['c']=20;
	mp['a']=40;
	mp['r']=60;
	printf("%d\n",mp.size());
	return 0;
}

(4)clear()清空map中的所有元素

#include
#include
#include
using namespace std;
int main(){
	map mp;
	mp['c']=20;
	mp['a']=40;
	mp['r']=60;
	mp.clear();  //清空map 
	printf("%d\n",mp.size());
	return 0;
}

C++标准模板库(STL)之map常见用法详解_第8张图片

 

你可能感兴趣的:(PAT,PAT,STL,map常见用法详解)