C++ map容器用法详解(附带实例)
C++ 的 map 容器中存储的是 pair 对象,即用 pair 类模板创建的键值对。其中,各键值对的键和值可以是 int、double 等基本数据类型,也可以是结构体、类等自定义类:学习 map 容器,必须提前搞清楚 pair 类模板。关于 pair 类模板,不了解的读者请猛击《C++ STL pair用法详解》一文系统学习。
- 一般情况下,map 容器中存储的键值对都是 string 类型;
- map 容器存储的键值对,键的值必须唯一,不能重复,也不能被修改。
- 当 map 容器中存储了多个键值对时,会自动根据键的大小进行排序。默认情况下,排序规则为 less<T>,即根据键做升序排序。也可以设置为 greater<T>,即根据键做降序排序。其中,T 为键的数据类型。
map 容器中存储的键值对,键必须唯一,值是否唯一不做要求。这就好比乘坐高铁,座位号必须唯一,不能重复,但乘坐的人是否重名,则不在考虑范围之内。
map 容器定义在
<map>
头文件中,并位于 std 命名空间中。因此,在使用该容器之前,代码中需引入 <map>
头文件,并默认使用 std 命令空间。
#include <map> using namespace std;
C++创建map对象
创建 map 对象的方法有以下 5 种:1) 创建空的 map 对象,语法格式如下:
map<key,type,predicate> name;其中,predicate(谓词)用于指定排序规则,默认使用 less<T> 规则进行升序排序。
例如,创建一个可容纳 int 型元素的空对象 intmap,代码如下:
map<int,int> intmap;
2) 创建 map 对象的同时进行初始化。例如,创建 mymap 对象,存储 3 个班级的人数,代码如下:
map<string,int>mymap { {"三年一班",45},{"三年二班",43},{"三年三班",46} };mymap 对象初始化后,包含 3 个键值对。
3) 使用复制构造函数,通过已有的 map 对象创建新的 map 对象,语法格式如下:
map<key,type> name(mymap);例如,在前面创建的 mymap 对象基础上,创建 newmap 对象,代码如下:
map<string,int> newmap(mymap);
4) 复制 map 对象的部分元素,创建新的map对象,语法格式如下:
map<type> name(first,last);
例如,在前面创建的 mymap 对象的基础上,创建 copymap 对象,代码如下:
map<string> copymap(++mymap.begin(), mymap.end());部分初始化的 copymap 对象仅包含两个 string 字符串:{"三年三班",46}和{"三年二班",43}。
5) 创建 map 对象时修改排序规则。例如,下面的代码修改排序规则为 greater<string>:
map<string,int,greater<string> > myset{{"三年一班",45},{"三年二班",43},{"三年三班",46}};排序之后,元素的存储顺序为:{"三年二班",43},{"三年三班",46},{"三年一班",45}。
注意,greater<string> 表达式后要有空格。
C++ map成员函数
map 容器的主要成员函数如表所示:函数 | 说明 |
---|---|
size() | 返回集合的大小 |
max_size() | 返回集合的最大容量 |
begin() | 返回指向集合中第一个元素的迭代器 |
end() | 返回指向集合中最后一个元素的迭代器 |
rbegin() | 返回一个反向迭代器,指向集合中最后一个元素 |
rend() | 返回一个反向迭代器,指向集合中第一个元素 |
empty() | 判断集合是否为空。如果为空,返回 true |
clear() | 删除集合中所有元素 |
erase(x) | 删除集合中值为 x 的元素 |
erase(start, end) | 删除迭代器 start 和 end 所辖范围内的元素 |
find(x) | 在集合中查找目标元素。如果 x 不存在,返回的迭代器等于 end |
lower_bound(x) | 查找集合中 ≥ 目标值的第一个元素 |
upper_bound(x) | 查找集合中 > 目标值的第一个元素 |
equal_range(x) | 查找集合中等于目标值的元素范围,返回一对迭代器 [first, last) |
swap() | 交换两个集合的内容 |
value_comp() | 返回 value_compare 类型的对象,用于判断元素先后次序 |
【实例】使用下标插入新元素。先创建 map 对象,再添加元素。具体代码如下:
#include <iostream> #include <map> using namespace std; int main() { map<int, char> cMap; // 创建 map 对象 cMap // 使用下标插入 5 个新元素 cMap[1] = 'B'; cMap[2] = 'C'; cMap[3] = 'D'; cMap[4] = 'G'; cMap[5] = 'F'; cout << "map" << endl; map<int, char>::iterator it; for (it = cMap.begin(); it != cMap.end(); ++it) { // 输出 cMap 中的所有元素 cout << (*it).first << "->" << (*it).second << endl; } return 0; }运行结果为:
map
1->B
2->C
3->D
4->G
5->F