map映照容器

本文详细介绍了C++中的map映射容器,包括其数据结构、元素插入、遍历、删除以及自定义比较函数。通过示例展示了如何创建、访问和操作map,以及如何使用反向迭代器。同时,还讲解了如何用map实现数字分离和字符映射。
摘要由CSDN通过智能技术生成

map映照容器

  • map映照容器的元素数据是由一个键值和一个映照数据组成的,键值与映照数据之间具有一一映照的关系。

  • map映照容器的数据结构也是采用红黑树来实现的,插入元素的键值不允许重复

  • 比较函数只对元素的键值进行比较,元素的各项数据可通过键值检索出来。

  • map映照容器元素的数据构成示意图。

image-20210806104330788

  • 需要包含头文件“#include

    map文件也包含了对multimap多重映照容器的定义。

使用

map创建、元素插入和遍历访问

  • 创建map对象,键值与映照数据的类型由自己定义。
  • 在没有指定比较函数时,元素的插入位置是按键值由小到大插入到黑白树中去的,这点和set一样。
#include<iostream>
#include<map>
using namespace std;

int main(){
	//定义map对象,目前没有任何对象 
	map<string,float> m;
	//插入元素,按键值的由小到大放入黑白树中
	m["jack"] =80;
	m["marry"] = 81; 
    //前向遍历
	map<string,float>::iterator it;
	for(it = m.begin();it!=m.end();it++){
		 //输出键值与映照数据
		cout<<(*it).first<<" : "<<(*it).second<<endl;
	} 
	return 0;
} 

程序编译时,可能会产生代号为“warning C4786”的警告,“4786”是标记符超长警告的代号。

可以在程序的头文件包含代码的前面使用“#pragma warning(disable:4786)”宏语句,强制编译器忽略该警告。

4786号警告对程序的正确性和运行并无影响。

删除元素

  • map映照容器的erase()删除元素函数,可以删除某个迭代器位置上的元素、等于某个键值的元素、一个迭代器区间上的所有元素。

  • 也可使用clear()方法清空map映照容器。

//删除"jack"
m.erase("jack");

元素反向遍历

可以使用反向迭代器reverse_iterator反向遍历map照映容器中的数据,它需要rbegin()方法和rend()方法指出反向遍历的起始位置和终止位置。

//反向遍历
map<string,float>::reverse_iterator rit;
for(rit = m.rbegin();rit != m.rend();rit++) {
    //输出键值与映照数据
    cout<<(*rit).first<<"\t"<<(*rit).second<<endl;
}

元素的搜索

使用find()方法来搜索某个键值,如果搜索到了,则返回该键值所在的迭代器位置,否则,返回end()迭代器位置。

map<string,float>::iterator it;
	
it = m.find("jack");
if(it != m.end()){
    cout<<"find it"<<endl;
}else{
    cout<<"can not find it"<<endl;
}

自定义比较函数

  • 将元素插入到map中去的时候,map会根据设定的比较函数将该元素放到该放的节点上去。

  • 在定义map的时候,如果没有指定比较函数,那么采用默认的比较函数,即按键值由小到大的顺序插入元素。

  • 编写比较函数与set比较函数是一致的,因为它们的内部数据结构都是红黑树。

    编写方法有两种。

    1. 如果元素不是结构体,那么,可以编写比较类。
    //由大到小 
    struct myComp{
    	//重载()操作符 
    	bool operator() (const string& a, const string& b){
    		return a>b;
    	}	
    };
    
    //定义map对象,采用自定义比较函数
    map<string,float,myComp> m;
    
    1. 如果元素是结构体,那么,可以直接把比较函数写在结构体内。
    #include<iostream>
    #include<map>
    using namespace std;
    
    //由大到小 
    struct info{
    	float score;
    	
    	//重载 < 操作符,自定义排序规则
    	bool operator < (const info& b) const {
    		return score > b.score;
    	} 
    };
    
    int main(){
    	//定义map对象,目前没有任何对象 
    	map<info,string> m;
    	
    	info a ={80};
    	m[a] = "jack";
    	
    	a.score = 90;
    	m[a] = "marry";
    
    	
    	map<info,string>::iterator it;	
    	for(it = m.begin();it!=m.end();it++){
    		 //输出键值与映照数据
    		cout<<(*it).second<<"\t"<<(*it).first.score<<endl;
    	} 
    	cout<<endl;
    
    	return 0;
    } 
    

用map实现数字分离

对数字的各位进行分离,采用取余等数学方法操作是很耗时的。

把数字当成字符串,使用map的映照功能,很方便地实现了数字分离。

字符到数字的映射

map<char,int> m;
	
/*
	m['0'] =0;
	m['1'] =1;
	...
*/ 
for(int i =0 ;i<10;i++){
    m['0'+i] = i;
}

数字映照字符的map写法

实现将数字映射为相应的字符

map<int,char> m;
	
/*
	m[0] ='0';
	m[1] ='1';
	...
*/ 
for(int i =0 ;i<10;i++){
    m[i] = i+'0';
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

暴风雨中的白杨

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

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

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

打赏作者

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

抵扣说明:

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

余额充值