C/C++ — STL中Map用法

本文深入探讨了C++ STL中的Map容器,详细介绍了其构造、数据插入、遍历、查询、删除及排序方法。Map是一种关联容器,采用红黑树实现,支持Key-Value存储,适用于快速查找和删除场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Map 是什么

Map是STL中的一个关联容器,Key–Value的存储形式。每个Key只能对应一个Value。具有快速查找,内部实现是一个红黑二叉树。特点可以增加和删除节点对迭代器的影响较小,仅可以修改Key对应的Value值。

Map的功能

自动建立Key - Value 的对应,Key和Value可以是任意类型。查找的复杂度为Log(N)(1000条记录最多10次)
快查 快删 根据Key修改Value

Map的使用

需要导入头文件

#include <map> // STL头文件没有扩展名.h

map 对象是一个模版类,需要关键字和存储对象两个模版参数

    std::map<int , std::string> person;

可以对模版进行类型定义使其使用方便

	typedef std::map<int , std::string> MAP_INI_STRING;
	MAP_INI_STRING person;

Map的构造

Map的构造函数系统提供啦6个,不同的构造函数涉及到内存的分配,可以根据自己实际的使用场景,来选取不同的构造方法。最通用的构造函数就是

 	std::map<int , std::string> mapPerson;

Map常用的数据插入方法

1、insert函数插入pair数据

    std::map<int , std::string> mapPerson;
     mapPerson.insert(pair<int,string>(1,"Jim"));

2、insert函数插入value_type数据

    mapPerson.insert(std::map<int, std::string>::value_type (2, "Tom"));

3、 用数组方式插入数据

	 mapPerson[3]="Jerry";

三种方法都是插入操作区别:
inster插入操作如果key 已经存在则不会做任何处理,
数组方式插入如果Key存在则更新Key对应的Value,如果不存在则添加新的Key–Value

Map数据的遍历

三种最常用的遍历方法:

1、前向迭代器

	  std::map<int ,std::string>::iterator it;
	   std::map<int ,std::string>::iterator itEnd;
	   it = mapPerson.begin();
	   itEnd = mapPerson.end();
	   while (it != itEnd) {
	      cout<<it->first<<' '<<it->second<<endl;  
	      it++;
	   }

2、反向迭代器

	 std::map<int, string>::reverse_iterator iter;  
	 for(iter = mapPerson.rbegin(); iter != mapPerson.rend(); iter++) 
	     cout<<iter->first<<"  "<<iter->second<<endl;  

3、数组形式

	   mapPerson.insert(std::map<int, std::string>::value_type (1, "Tom"));
	   mapPerson[2]= "Jim";
	   mapPerson[3]= "Jerry";
	
	  int nSize = mapPerson.size();
	  for(int n=1; n<= nSize; n++)
	      qDebug()<<QString::fromStdString(mapPerson[n]);

三种都是遍历,建议使用前向迭代器,慎用使用数组形成(角标开始位置谨慎)。

Map中查询元素

1、cout 函数存在返回1 不存在返回0 内部实现是通过find函数
2、find函数可以定位出现的位置,返回数据所在位置的迭代器。
3、使用upper_bound 函数和lower_bound函数 如map中存在key(1,2,3,4),
则lower_bound(2)返回值2, upper_bound(2) 返回值3 可以根据这两个的返回值是否相等来判断是否存在

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());

注意:如果map里面存储的是对象指针,在用户erase() 需要用户手动的管理内存,erase方法只是将对象从Map中移除

Map中的swap用法

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

注意: map中的erase以及clear,不会立马回收内存,map有较为科学的内存回收机制。可以认为clear以及erase的空间,map会在合适的时间回收。

Map 中排序

。。。。。

Map的基本操作函数

    begin()         返回指向map头部的迭代器

     clear()        删除所有元素

     count()         返回指定元素出现的次数

     empty()         如果map为空则返回true

     end()           返回指向map末尾的迭代器

     equal_range()   返回特殊条目的迭代器对

     erase()         删除一个元素

     find()          查找一个元素

     get_allocator() 返回map的配置器

     insert()        插入元素

     key_comp()      返回比较元素key的函数

     lower_bound()   返回键值>=给定元素的第一个位置

     max_size()      返回可以容纳的最大元素个数

     rbegin()        返回一个指向map尾部的逆向迭代器

     rend()          返回一个指向map头部的逆向迭代器

     size()          返回map中元素的个数

     swap()           交换两个map

     upper_bound()    返回键值>给定元素的第一个位置

     value_comp()     返回比较元素value的函数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值