本文共 7906 字,大约阅读时间需要 26 分钟。
map/multimap的简介
map是标准的关联式容器,一个map里存储的元素是一个键值对序列,叫做(key,value)键值对。它提供基于key快速检索数据的能力。#include <map>
multimap与map的区别:
map支持唯一键值,每个键只能出现一次;而multimap中相同键可以出现多次。multimap不支持[]操作符。map/multimap容器 和 set/multiset容器都是差不多的,只是map/mulitmap比他们多了一个键值!
如果不懂set/multiset容器的可以点下面链接:
当然,map/multimap容器也有仿函数,因为在之前的文章中,已经详细讲过了,所以这里就不在讲了,如果不懂的可以点下面链接去学习:
定义
// 无参 mapm1; map m2; map m3; map m4; // 带参 map m5(m1.begin(), m1.end()); // 迭代器 map m6(m3); // 调用拷贝构造函数 map m7 = m4; // 调用了赋值构造函数
还可以用各种指针类型或自定义类型
插入
// 方式一 构造一个pair,然后插入,如果键存在,则插入失败
m1.insert(pair<int, string>(1, “张三”));// 方式二 使用make_pair
m1.insert(make_pair(2, “李四”));// 方式三 使用value_type,相当于pair<int, string>
m1.insert(map<int, string>::value_type(3, “王五”));// 方式四 使用 [] 重载,如果键值对已经存在,则覆盖原值
m1[4] = “赵六”; m1[4] = “韩七”;注意:
方式一 至 方式三的返回值类型都是一样的,都是
pair<iterator,bool> 类型第四种方法非常直观,但碰到相同的键时会进行覆盖操作。比如插入key 为4的键值时,先在mapStu中查找主键为4的项,若不存在,则将一个键为4,值为默认初始化值的对组插入到mapStu中,然后再将值修改成“赵六”。若发现已存在4这个键,则修改这个键对应的value。
string strName = mapStu[8]; //取值操作或插入操作
只有当mapStu存在8这个键时才是正确的取操作,否则会自动插入一个实例,键为8,值为默认构造时的初始化值。
下面测试代码 函数 test1 中会有详细案例
迭代器
// 返回容器中第一个数据的迭代器
m1.begin();// 返回容器中最后一个数据之后的迭代器
m1.end();// 返回容器中倒数第一个元素的迭代器
m1.rbegin();// 返回容器中倒数最后一个元素的后面的迭代器
m1.rend();// 使用迭代器方式输出容器里的值
for (map::iterator it = m1.begin(); it != m1.end(); it++) { cout << "key:" << (*it).first << " value:" << (*it).second << endl;}
排序
map 和 multimap 容器默认存储时是顺序存储的,即
map<int, string> m1; 相等于: map<int, string, less<int>> m1;
也可以使用greater定义一个容器,使其默认逆序存储,即
map<int, string, greater<int>> m2;
在此条链接中会有详细解析:
// 交换容器中的元素
m3.swap(m2);// 返回容器中元素的个数
m1.size();// 判断容器是否为空
m1.empty(); // 为空返回真,不为空返回假//删除迭代器所指的元素,返回下一个元素的迭代器
m1.erase(m1.begin());//删除区间[beg,end)的所有元素,返回下一个元素的迭代器
m1.erase(beg, end);//删除容器中key为key的对组,返回删除的对组个数
m1.erase(8);// 删除容器中所有的元素
m1.clear();查找
map方式
// 查找键key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回map.end();/*---map---*/// 查找键key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回map.end();map::iterator it = m1.find(5);if (it != m1.end()) { cout << "m1.find(5) = " << (*it).second << endl;} else { cout << "没找到!!!" << endl;}
multimap方式
// 查找键key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回map.end();/*---multimap---*/// 查找键key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回map.end();multimap::iterator mit = m2.find(111);if (mit != m2.end()) { for (; mit != m2.end(); mit++) { if ((*mit).first == 111) { cout << "m2.find(111) = " << (*mit).second << endl; } else { break; } }}
// 返回容器中键值为key的对组个数。对map来说,要么是0,要么是1;对multimap来说,值>=0
m1.count(222);// 返回第一个 >= key 元素的迭代器
m1.lower_bound(2);// 返回第一个 > key 元素的迭代器
m1.upper_bound(2);//返回容器中key与keyElem相等的上下限的两个迭代器。上限是闭区间,下限是开区间,如[beg,end)
//m1.equal_range(keyElem); m1.equal_range(7);返回值是: pair<iterator, iterator> 类型
在下面测试代码函数 test7 中会有详细案例。
测试代码:
#include
总结:
STL容器中,所有容器的接口用法都是差不多的,所以说其实并不难,只要理解了一种,其他的容器用法都全会了。转载地址:http://hrpjz.baihongyu.com/