C/C++ — STL中Map用法
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的函数