map是key-value构成的集合。
4.2 操作map是键值对
- 主要用来查找key对应value,要求key必须是可排序的,必须支持<比较运算符。
- map默认是以key升序存放键值对
数据,比较适合二分查找。
map内部结构:
1、map使用pair
2、pair
3、在map里面可以使用map<>::value_type表示pair
typedef pair4.2.1 初始化value_type;
1、默认构造(可带参数)
2、复制构造
3、范围赋值构造
初始化时必须给map<>类模板同时设置key与value的类型模板实参。
实参类型不限于基本类型、类类型(class、struct、union),还可以是容器模板。
- 迭代器
| 迭代器 | 作用 |
|---|---|
| c.begin() | 头迭代器 |
| c.end() | 尾迭代器 |
| c.rbegin() | 反向头迭代器 |
| c.rend() | 反向尾迭代器 |
注:与vector相似。
- 数据量操作
| 函数 | 作用 |
|---|---|
| c.size() | 大小 |
| c.max_size() | 最大大小 |
| c.empty() | 判空 |
| c.clear() | 清空 |
1、insert插入pair<>数据
#include#include
0 0 1 10 2 20 3 30 4 40 5 50 6 60 7 70 8 80 9 90
2、insert插入map<>::value_type数据
#include#include
0 0 1 10 2 20 3 30 4 40 5 50 6 60 7 70 8 80 9 90
3、insert插入make_pair数据
make_pair是一个函数模板,类似与如下实现:
templatemake_pair(K const& k,V const& v){ return pair (k,v); }
#include#include
4、下标运算符[]添加数据
#include#include
注:map只有在访问key,如果key不存在则会创建,反之,使用已存在的
1、迭代器for循环
for(map::iterator it = m.begin();it != m.end();it++){ cout << "[" << it->first << "]=" << it->second() << endl; }
2、for_each()循环
定义函数指针
inline void Display(map::value_type const& val){ cout << "[" << val.first << "]=" << val.second << endl; }
执行for_each
for_each(m.begin(),m.end(),Display);
3、C++11auto迭代器写法
for(auto it = m.begin();it != m.end();it++){
cout << "[" << it->first << "]=" << it->second() << endl;
}
4、C++11 for-loop-scope迭代器写法
for(auto p : m){
cout << "[" << p.first << "]=" << p.second << endl;
}
5、C++11 for_each()与lamdba表达式
for_each(m.begin(),m.end(),[](map4.2.5 key查找::value_type& p){ cout << "[" << p.first << "]=" << p.second << endl; });
1、count()判断key是否存在
if(m.count(key) == 1){
...
}
2、find()判断key是否存在以及位置
map::iterator it = m.find(key); if(m.end() != it){ ... }
3、下标运算符[]
m[key];
如果key不存在,默认创建。
4.2.6 区域查找| 成员变量 | 作用 |
|---|---|
| m.lower_bound(key) | key下边界 |
| m.upper_bound(key) | key上边界 |
| m.equal_range(key) | key上下边界 |
1、关键字删除
m.erase(key);
2、迭代器删除
m.erase(m.begin());
3、区域删除
m.erase(it_a,it_b);4.2.8 排序
默认按照key升序排列。自定义排序是,可以在实例化加上key的comp仿函数,重载<运算符
map4.3 实例m;
1、两个数组合并成一个map
#include#include
true,true,false,true,true,false,true,false, [1]=19 [2]=29 [3]=79 [4]=49 [5]=59
注:在C++11中transform可以使用lamdba表达式,改写成
transform(arr1,arr1+8,arr2,res,[&m](int k,int v){
return m.insert(make_pair(k,v)).second;
});
2、把map的key和value各自分解成一个vector
#include#include #include // ostream_iterator #include #include
0,1,2,3,4,5,6,7,8,9, 0,10,20,30,40,50,60,70,80,90,
在C++11中for_each可以使用lamdba表达式,改写成
for_each(m.begin(),m.end(),[&keys,&values](map::value_type const& pair){ keys.push_back(pair.first); values.push_back(pair.second); });
使用C++11 for-loop-scope语法
for(auto p:m){
keys.push_back(p.first);
values.push_back(p.second);
}
3、map实现采用映射实现字典查找
#include#include
Apple 苹果 Banana 香蕉 Car 小汽车 Cat 猫 Orange 橘子 橘子 Orange 汽车 Car 猫 Cat 苹果 Apple 香蕉 Banana 猫 Cat



