C++ std::map 是一个关联容器,建立关键字(key)与值(value)的一一映射关系,以便简单高效地进行数据检索。
它是 C++容器 的一部分,可在 cppreference 找到。
std::vector(连续存储容器)、std::list 、std::array 和 std::deque 都是序列容器,大家想必都了解。
所以,我们先使用 std::map 构建一个示例。
Incredibuild 的变更日志中记录了其系统的更新轨迹。假设我们现在需要创建一个数据结构来建立这个变更日志的模型,你可能会根据链接中的内容做出一些预测。
模型中必须有的节点信息包括:
- 版本号
- 发布日期
- 变更日志文本
变更日志是按时间线性排列的。不过,当我需要检索几个月前的变更日志时,比如 4.5 版,我必须按顺序查遍列表,这种方法的效率显然很低。所以,我需要一种更加高效的方法,来快速定位所需的信息。这个问题很适合用 C++ map 解决。
如果我将此数据结构更改为以版本号为关键字,其他两个数据为值的 map。
#include <map>
#include <string>
#include <chrono>
using date = std::chrono::time_point<std::chrono::steady_clock>;
std::map<std::string, std::pair<date, std::string>> changelog;
这个数据结构现在看起来如何?不再是线性结构,而是变成了树形结构(C++ map 存储为一棵红黑树,这是库编写器的一个特点)
如何加快检索速度?检索不再是一个接一个地直线搜索,而是根据红黑树的结构,使用最快的捷径路线,直接定位。具体可参考下面的动画演示: