C++ flat_map

17 Mar 2025 | 5 分钟阅读

在本文中,您将通过示例了解 C++ 中的 flat_map

什么是 flat map?

一种名为 flat_map 的数据结构结合了向量和映射的特性。本质上,它是一个有序关联容器,以连续内存架构存储 - ,就像向量一样。

此设计选择的使用有几个重要含义

1. 有序项

  • 与没有特定顺序的 std::unordered_map 相比,flat map 中的项以键确定的特定顺序保存。
  • 它在必须维护元素顺序的情况下很有用。

2. 快速查找

  • std::map 一样,flat map 能够根据键进行快速查找。
  • 由于键保持有序,因此搜索操作可以以 对数时间复杂度 执行。

3. 类似向量的特性

  • 像向量一样,flat map 允许您快速遍历元素,因为数据是连续存储的。

4. 内存开销低

  • 由于 flat map 以连续方式存储其项,因此它通常比 std::map 具有 更少的内存开销

5. 值语义

  • flat_map 将键值对一起存储,而不是像 std::map 那样独立存储键和值。
  • 这使得数据结构更容易使用。

它与其他映射实现有何区别?

要充分了解 flat_map 的好处,将它与其他 C++ 映射实现进行对比非常重要

1. std::map

  • std::map 是一个基于平衡二叉搜索树的容器。
  • 它提供对数复杂度,并在大多数操作中保持元素排序。
  • 然而,由于树结构,存在一些开销,这可能会导致内存消耗略大。

2. std::Unordered map

  • 由于 std::unordered_map 构建在哈希表上,因此大多数操作都具有常数时间复杂度。
  • 但是,它不保留元素的特定序列。
  • 虽然它比 std::map 使用更少的内存,但当元素顺序很重要时,它不是最佳选择。

3. flat map

  • flat_map 结合了两者的优点,提供类似向量的迭代、快速查找、有序项和少量内存开销。
  • 由于其有序元素和连续存储,它成为许多使用场景的理想选择,特别是当您同时需要高效的基于键的访问和可预测的元素顺序时。

何时使用 flat_map:-

在某些情况下可以使用 flat_map。在以下情况下,flat_map 可能是一个明智的选择

1. 维护元素顺序

  • 如果您需要保留特定的元素顺序,flat map 是一个不错的选择。
  • 对于排序和显示数据等任务,它会很有帮助。

2. 基于键的查找

  • 如果您需要具有对数复杂度的快速基于键的查找,flat_map 是一个合适的选择。
  • 在效率方面,它在 std::mapstd::unordered_map 之间找到了一个中间地带。

3. 高效迭代

  • flat map 提供连续存储,当您需要像使用向量一样迭代元素时,它成为最佳选择。

4. 内存开销低

  • 由于 flat_map 的存储是连续的,因此当内存使用是一个问题时,它通常比 std::map 具有更少的内存开销。

程序

让我们举一个例子来说明 flat_map 在 C++ 中的使用。

输出

C++ flat_map

说明

  • 包含头文件: 代码开头包含了所需的 C++ 标准库头文件。它包括 <map> 用于构建映射,<vector> 用于创建向量,以及 <iostream> 用于输入和输出。
  • 创建 std::vector 和 std::map: 我们定义两种类型的数据结构:两个对象:一个名为 flatMap 的 std::pair<int, std::string> 的 std::vector 和一个名为 myMap 的 std::map。该向量将模仿 flat map,而该映射将保存键值对。
  • 将键值对插入 std::map: 使用方括号表示法更新 myMap,其中包含四个键值对。字符串是值,整数是键。
  • 将 std::map 转换为 flat map(向量): 代码使用 push_back 方法遍历 myMap,将每个键值对添加到 flatMap 向量中。它模拟了 std::map 如何转换为由 std::vector 表示的 flat map。
  • 擦除前打印映射: 代码在擦除任何内容之前输出 flatMap 向量中的键值对。它遍历向量,显示每个键和值。
  • 清除 flat map(向量): 代码利用 clear 方法从 flatMap 向量中删除所有条目,以有效地清除 flat map。
  • 检查 flat map 是否为空: 最后,代码使用 empty 方法查看 flatMap 向量是否为空。如果为空,则会显示一条通知,说明已清除的 flat map 为空。

结论

在 C++ 数据结构中,flat_map 是一种特别适应且有效的选项,适用于各种使用场景。它结合了 std::unordered_map 的最小内存开销和类似向量的迭代,以及 std::map 的有序项和基于键的查找。