STL之map、multimap学习总结(C++)

概述

  1. STL关联容器能通过关键字(search key)直接访问从而存储和读取元素。在关联容器中按排序顺序维护关键字。对关联容器迭代时,按该容器的排列顺序遍历。
  2. map、multimap提供了操作与每个关键字相关联的值(映射值mapped value)的方法;map、multimap的元素是关键字和数值对。插入时,使用包含关键字和数值对的pair对象;map、multimap通常实现为红黑二叉查找树,数的节点是关键字/数值对。
  3. map、multimap的主要差别:multimap允许存放与数值相关联的重复关键字(一对多映射),而map只允许存放与数值相关联的唯一关键字(一对一映射)。
  4. map是一对一映射,利用map可以指定关键字,迅速取得相关数据,map通常称为关联数组。在map的下标运算符[ ]中提供关键字,即可找到该关键字的相关数据。可以在map 的任何地方进行插入与删除。
  5. multimap关联容器用于快速存储和读取关键字与相关值(关键字/数值对)。
  6. map、multimap支持双向迭代器。
    在这里插入图片描述

具体用法

0. 头文件

#include<map>

1. 声明和初始化

用 typedef 使得类型名较长的代码更方便读写

//声明一个map,关键字int类型,相关值double类型,默认升序排列
	 map<int,double>map1;
或 map<int,double,less<int>>map1;

//声明一个multimap,关键字int类型,相关值double类型,按升序排列,默认升序排列
	 multimap<int,double>map1;
或 multimap<int,double,less<int>>map1;

//用typedef生成用函数对象less<int>按升序排列的整型multimap类型,
//这个新类型用于实例化一个整型multimap对象map1
	typedef multiset<int, double,less<int>> mmid;
	mmid map1;

//声明一个multimap,关键字int类型,相关值double类型,按降序排列
	multimap<int, double,greater<int>>set1;
或 
	typedef multiset<int,double,greater<int>>  mmid;
	 mmid set1;

//声明一个map1,将map2赋值给map1
	mmid map1=map2;
或 mmid map1(map2);
或 mmid map1(map2.begin(),map2.end());

//声明一个set1,赋值{1,2,3,4}
	mmid set1={1,2,3,4};

//声明一个set1,将数组a[0]到a[4]赋值给set1
	mmid set1=(a,a+5);
或 mmid set1=(&a,&a+5);

//生成一个set1,将大小设为10,且每个元素都为设置为5
	mmid set1(10,5);




2. 常用函数(查询)

2.1 empty()

map1.empty(); //返回值bool类型,若map1为空,则返回true

2.2 size()

map1.size(); //返回值为int类型,map1当前存放的元素的个数

2.3 find()

//返回iterator,指向第一个找到数值2的位置,若找不到则返回的iterator等于map1.end()
map1.find(2); 

2.4 lower_bound()

//返回map1中第一个找到数值2的位置的iterator,如果找不到则返回end()
map1.lower_bound(2); 

2.5 upper_bount()

//返回map1中最后一个找到数值2的位置的后一个位置的iterator,如果找不到则返回end()
map1.upper_bound(2); 

2.6 equal_range()

//声明一个pair类对象p,pair类对象用于操作数值对
//pair类型包含两个public数据成员first和second
//在这里,pair的内容是整型multiset的两个iterator。
	pair<mmid::iterator, mmid::iterator> p;

//确定map1中数值2的lower_bound和upper_bound,返回类型为pair
	p=map1.equal_range(2); 

2.7 count()

	map1.count(2); //确定map1中数值2出现的次数

2.8 迭代器

map的迭代器通常实现为map元素的指针。

//开始指针(正向)
map1.begin()

//结束指针(正向),指向map1最后一个元素的后一位
map1.end()

//开始指针(逆向)
map1.rbegin()

//结束指针(逆向),指向map1最后一个元素的后一位
map1.rend()

//常量开始指针(正向),不能通过该指针来修改所指内容
map1.cbegin()

//常量结束指针(正向),不能通过该指针来修改所指内容,指向map1最后一个元素的后一位
map1.cend()

2.9 输出

//迭代器,顺序访问
	for (map<int, double>::iterator p = nums.begin(); p != nums.end(); p++)
		cout << p->first << '\t' << p->second;
或 	
	for (multimap<int, double>::iterator p = nums.begin(); p != nums.end(); p++)
		cout << p->first << '\t' << p->second;
		
//迭代器,逆序访问
	for (map<int, double>::iterator p = nums.rbegin(); p != nums.rend(); p++)
		cout << p->first << '\t' << p->second;

//输出迭代器,copy算法
	ostream_iterator<int> output(cout, " ");
	copy(map1.begin(),map1.end(),output);
	cout<<endl;

3. 常用函数(操作)

3.1 insert()

若是map的话,插入已存在的关键字会失败,但不会报错,只是直接忽略。

//在map1中插入数值对(2,10.2),由于声明了升序排列,插入后map将保持升序
	map1.insert(mmid::value_type(2,10.2));
	
//若map中已存在关键字2,那么将相关值修改为20;若不存在,则相当于插入操作
	map1[2]=20;

3.2 erase()

//在map1中删除迭代器指向的元素
	map1.erase(map1.begin());
	
//在set1中删除迭代器指向的区间的全部元素
	map1.erase(map1.begin(),map1.end());
	
//在set1中删除元素等于10的所有副本
	map1.erase(10);

3.3 swap()

//将map1和map2交换
	map1.swap(map2);

3.4 resize()

//重置map1的大小为10
	map1.resize(10);

4. 常用算法

4.0 头文件

#include<algorithm>

4.1 copy()

//将set2从头到尾的内容复制给set1
copy(set2.begin(),set2.end(),set1);

//输出set1的内容
copy(set1.begin(),set2.end(),ostream_iterator<int>(cout,"  ")); 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值