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