首页 > 编程笔记 > C++笔记 阅读:8

C++ map容器用法详解(附带实例)

学习 map 容器,必须提前搞清楚 pair 类模板。关于 pair 类模板,不了解的读者请猛击《C++ STL pair用法详解》一文系统学习。

C++ 的 map 容器中存储的是 pair 对象,即用 pair 类模板创建的键值对。其中,各键值对的键和值可以是 int、double 等基本数据类型,也可以是结构体、类等自定义类:
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 容器的主要成员函数如表所示:

表: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

相关文章