Skip to content

std::flat_map(C++23)

一句话

用连续数组替代红黑树的有序映射——查找更快(缓存友好),内存更紧凑,但插入/删除是 O(n)。

头文件

#include <flat_map>

核心 API 速查

操作签名说明
访问元素V& operator[](const K& key)按键访问,不存在则插入默认值
查找iterator find(const K& key)返回指向元素的迭代器
插入pair<iterator, bool> insert(const value_type&)插入键值对
删除size_t erase(const K& key)按键删除元素
元素数量size_t size() const返回元素个数
是否为空bool empty() const检查是否为空
清空void clear()清除所有元素
迭代iterator begin() / end()按键序遍历
下界/上界iterator lower_bound(const K&)有序查找边界
是否包含bool contains(const K& key) const(C++20 起可用) 检查键是否存在

最小示例

cpp
// Standard: C++23
#include <flat_map>
#include <iostream>

int main() {
    std::flat_map<int, const char*> m;
    m[1] = "one";
    m[3] = "three";
    m[2] = "two";

    for (const auto& [k, v] : m) {
        std::cout << k << ": " << v << "\n";
    }
    // 1: one  2: two  3: three  (按键序排列)

    std::cout << std::boolalpha << m.contains(2) << "\n"; // true
}

嵌入式适用性:中

  • 连续存储对 CPU 缓存友好,小数据集的查找性能远优于 std::map
  • 无节点分配器开销,内存碎片更少,适合堆空间受限的嵌入式环境
  • 插入/删除 O(n),不适合频繁修改的大数据集
  • 编译器支持尚在推进中(GCC 15+、Clang 20+、MSVC 19.51+),生产环境需评估工具链

编译器支持

GCCClangMSVC
152019.51

另见


部分内容参考自 cppreference.com,采用 CC-BY-SA 4.0 许可

基于 VitePress 构建