map/multimap容器

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

输出样式:在这里插入图片描述

发布了31 篇原创文章 · 获赞 20 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/souhanben5159/article/details/104017459
今日推荐