STL容器与算法 (八)C++ map知识点

C++ map

Map是STL [1] 的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道。

map容器属于关联容器中的有序容器。之前所写的srting、vector、list、queue、deque都属于顺序容器;我们接下来所学的map,set都是关联容器。
关联容器的特点是:键—值 对,key—value;顺序容器直接是实值,没有代表性的键值。例如,1—1号学生个人信息,我们在容器中查找1号学生信息,我们只需要找到1的位置就能查询到1号学生信息。

定义

map是键值保存,高效访问,通过键值排序,通过键值查找。
特点:

  • 高效访问,比如容器中有一百万个数据量,map是1~20次找到,而list则是O(log(n))次。缺点:插入效率低于链表,因为涉及到排序
  • 键值不能重复

map和multimap十分相似,区别在于mao容器中元素的关键字不能重复。multimap有的成员函数,map都有。此外,mao还有成员函数operator[]:T & operator[] (Key k);
该成员函数返回 first 值为 k 的元素的 second 部分的引用。如果容器中没有元素的 first 值等于 k,则自动添加一个 first 值为 k 的元素。如果该元素的 second 成员变量是一个对象,则用无参构造函数对其初始化。


头文件

需要引用一个头文件#include<map>

#include<iostream>
#include<map>
using namespace std;

构造函数

  • 无参构造

  • insert()插入元素

语法一:

pair<iterator, bool> insert( const pair<KEY_TYPE,VALUE_TYPE> &val );
只有在val不存在时插入val。返回值是一个指向被插入元素的迭代器和一个描述是否插入的bool值。

pair<键,值>
键值不能重复,实值可以重复;
输出键值用first,实值用second;

void fun(pair<int,char> pr)
{
   
	cout << pr.first << " " << pr.second << endl;
}

void MapConstruct()
{
   
	typedef pair<int,char> in_pair;
	
	map<int , char> mp; // < / >  
	mp.insert(pair<int,char>(1,'a'));//插入方法一
	mp.insert(in_pair(2,'b'));//插入方法二

	
	for_each(mp.begin(),mp.end(),fun);
}

输出结果为:
在这里插入图片描述

我们知道在map容器中键值不能有重复的,那我们实验一下,如果有重复的,输出结果会是什么?怎样才能报错;

typedef pair<int,char> in_pair;
	
	map<int , char> mp; // < / >  
	mp.insert(pair<int,char>(1,'a'));
	mp.insert(in_pair(2,'a'));
	mp.insert(in_pair(2,'b'));  //此处,存在两个键值为2的元素
	
	for_each(mp.begin(),mp.end(),fun);//遍历输出

输出结果:
在这里插入图片描述
我们不难发现只有第一个键值为2 的成功输出出来,那么另一个我们怎么判定是map容器内存在重复元素;我们通过定义pair<map<int,char>::iterator,bool>pr;,通过输出bool的真假去判断键值是否重复

typedef pair<int,char> in_pair;
	pair<map<int,char>::iterator,bool>pr;
	
	map<int , char> mp; // < / >  
	mp.insert(pair<int,char>(1,'a'));

	pr = mp.insert(in_pair(2,'a'));
	cout << pr.second << endl;
	
	pr = mp.insert(in_pair(2,'b'));
	cout << pr.second << endl;

输出结果:
在这里插入图片描述
由此我们看到,第一个插入成功bool为1,第二个因为键值重复导致失败所以为0.

语法二:

iterator insert( iterator pos, const pair<KEY_TYPE,VALUE_TYPE> &val );
插入val到pos的后面,然后返回一个指向这个元素的迭代器。

使用迭代器进行插入,迭代器可以++,但是不可以+2,+3之类的;由于map内部会自动排序,不管用迭代器插入到任意位置,map容器也会将其排序,插入到其应有的序列中去

	typedef pair<int,char> in_pair;
	pair<map<int,char>::iterator,bool>pr;
	
	map<int , char> mp; // < / >  
	mp.insert(pair<int,char>(1,'a'));
	pr = mp.insert(in_pair(3,'a'));
//	cout << pr.second << endl;	
	pr = mp.insert(in_pair(4,'b'));
//	cout << pr.second << endl;
	pr = mp.insert(in_pair(5,'b'));
	pr = mp.insert(in_pair(6,'b'));
	pr = mp.insert(in_pair(7,'b'));
	pr = mp.insert(in_pair(9,'b'));
	
	map<int,char>::iterator ite = mp.begin();
	ite++;
	ite++;
	ite++;
	ite++;  //插入第4个位置
	mp.insert(ite, in_pair(2,'b'));
	
	for_each(mp.begin(),mp.end(),fun);

输出结果:

加粗样式
看出我们本应该在第四个位置插入2,b,却被其自动插入到第二个位置,并以键值按照升序排列。

语法三:

void insert( input_iterator start, input_iterator end );
插入start到end的元素到map中。

	map<int,char> mp1;
	mp1.insert(in_pair(8,'d'));
	mp1.insert(in_pair(10,'d'));
	mp.insert(mp1.begin(),mp1.end());
	

输出结果:
在这里插入图片描述

  • 一个参数

用另一个map容器,定义一个新的容器

	map<int,char>mp2(mp1)
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值