STL map的介绍与使用

STL map的介绍与使用

1、map简介
map是一类关联式容器。它的特点是增加和删除节点对迭代器的影响很小,除了那个操作节点,对其他的节点都没有什么影响。
对于迭代器来说,可以修改实值,而不能修改key。

2、map的功能
自动建立Key - value的对应。key 和 value可以是任意你需要的类型。
根据key值快速查找记录,查找的复杂度基本是Log(N),如果有1000个记录,最多查找10次,1,000,000个记录,最多查找20次。
快速插入Key -Value 记录。
快速删除记录
根据Key 修改value记录。
遍历所有记录。

3、使用map
使用map得包含map类所在的头文件
#include //注意,STL头文件没有扩展名.h
map对象是模板类,需要关键字和存储对象两个模板参数:
std:map<int,string> personnel;
这样就定义了一个用int作为索引,并拥有相关联的指向string的指针.

4、 map的构造函数
map共提供了6个构造函数,这块涉及到内存分配器这些东西,略过不表,在下面我们将接触到一些map的构造方法,这里要说下的就是,我们通常用如下方法构造一个map:
map<int, string> mapStudent;

5、 数据的插入
(1)mapStudent.insert(pair<int, string>(1, “student_one”));
(2)mapStudent.insert(map<int, string>::value_type(2, “student_two”));
(3)mapStudent[3] = “student_three”;

6、 map的大小
在往map里面插入了数据,我们怎么知道当前已经插入了多少数据呢,可以用size函数,用法如下:
Int nSize = mapStudent.size();

7、 数据的遍历

这里也提供三种方法,对map进行遍历
第一种:应用前向迭代器,上面举例程序中到处都是了,略过不表
第二种:应用反相迭代器,下面举例说明,要体会效果,请自个动手运行程序
第三种,用数组的形式,程序说明如下:
for(int nindex = 1; nindex <= mapStudent.size(); nindex++)
cout<<mapStudent[nindex]<<endl;

8、 查找并获取map中的元素(包括判定这个关键字是否在map中出现)
在这里我们将体会,map在数据插入时保证有序的好处。
要判定一个数据(关键字)是否在map中出现的方法比较多,这里标题虽然是数据的查找,在这里将穿插着大量的map基本用法。
这里给出三种数据查找方法
第一种:用count函数来判定关键字是否出现,其缺点是无法定位数据出现位置,由于map的特性,一对一的映射关系,就决定了count函数的返回值只有两个,要么是0,要么是1,出现的情况,当然是返回1了
第二种:用find函数来定位数据出现位置,它返回的一个迭代器,当数据出现时,它返回数据所在位置的迭代器,如果map中没有要查找的数据,它返回的迭代器等于end函数返回的迭代器。
查找map中是否包含某个关键字条目用find()方法,传入的参数是要查找的key,在这里需要提到的是begin()和end()两个成员,

分别代表map对象中第一个条目和最后一个条目,这两个数据的类型是iterator.
map<int, string>::iterator iter;
iter = mapStudent.find(1);
if(iter != mapStudent.end())
cout<<"Find, the value is "<second<<endl;
else
cout<<“Do not Find”<<endl;

9、 从map中删除元素
移除某个map中某个条目用erase()
该成员方法的定义如下:
iterator erase(iterator it);//通过一个条目对象删除
iterator erase(iterator first,iterator last)//删除一个范围
size_type erase(const Key&key);//通过关键字删除
clear()就相当于enumMap.erase(enumMap.begin(),enumMap.end());

10、 map中的swap用法
map中的swap不是一个容器中的元素交换,而是两个容器所有元素的交换。

11、 排序 · map中的sort问题
map中的元素是自动按Key升序排序,所以不能对map用sort函数;

*/

//map set都是红黑树实现的

#include <map>  
#include <string>  
#include <iostream>  
using namespace std;
int main()
{
	map<int, string> mapStudent;
	
	//插入
	mapStudent.insert(pair<int, string>(1, "student_one"));
	mapStudent.insert(pair<int, string>(3, "student_3"));
	mapStudent.insert(pair<int, string>(2, "student_2"));
	mapStudent.insert(map<int, string>::value_type(5, "student_5"));
	mapStudent.insert(map<int, string>::value_type(4, "student_4"));
	mapStudent.insert(map<int, string>::value_type(6, "student_six"));
	map<int, string>::iterator iter;

	//遍历 自动Key升序排序
	for (iter = mapStudent.begin(); iter != mapStudent.end(); iter++)
		cout << iter->first << ' ' << iter->second << endl;

	//查找
	iter = mapStudent.find(1);
	if (iter != mapStudent.end())
		cout << "Find, the value is " << iter->second << endl;
	else
		cout << "Do not Find" << endl;

	//删除
	mapStudent.erase(iter);
	for (iter = mapStudent.begin(); iter != mapStudent.end(); iter++)
		cout << iter->first << ' ' << iter->second << endl;

	//如果要删除1,用关键字删除  

	int n = mapStudent.erase(2);//如果删除了会返回1,否则返回0  
	if (n == 1)
		cout << "erase success" << endl;
	for (iter = mapStudent.begin(); iter != mapStudent.end(); iter++)
		cout << iter->first << ' ' << iter->second << endl;
	//mapStudent.erase(mapStudent.begin(), mapStudent.end());//把整个map清空  

	//成片删除要注意的是,也是STL的特性,删除区间是一个前闭后开的集合  

}

输出:
1 student_one
2 student_2
3 student_3
4 student_4
5 student_5
6 student_six
Find, the value is student_one
2 student_2
3 student_3
4 student_4
5 student_5
6 student_six
erase success
3 student_3
4 student_4
5 student_5
6 student_six

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值