{
  "schemaVersion": "0.11.0",
  "canonical": "https://www.pystone.net/notes/cpp-map-vs-unordered-map/",
  "atlas": "https://www.pystone.net/?node=cpp-map-vs-unordered-map#knowledge-atlas",
  "markdown": "https://www.pystone.net/notes/cpp-map-vs-unordered-map.md",
  "context": "https://www.pystone.net/notes/cpp-map-vs-unordered-map.context.json",
  "knowledgeVersion": "224c990773de.5fa8af6e39fa",
  "build": {
    "siteCommit": "224c990773de166d23a886306577dd90379529ce",
    "notesCommit": "5fa8af6e39fa3891d1b9b4832bfa6c4e0ecaaf0a",
    "builtAt": "1970-01-01T00:00:00.000Z",
    "version": "224c990773de.5fa8af6e39fa"
  },
  "id": "note:cpp-map-vs-unordered-map",
  "slug": "cpp-map-vs-unordered-map",
  "title": "C++ `std::map` 与 `std::unordered_map` 的区别",
  "type": "note",
  "visibility": "public",
  "idStability": "rename-stable",
  "author": {
    "name": "Perrin Yong",
    "profile": "https://www.pystone.net/profile/"
  },
  "publisher": {
    "name": "Perrin Yong",
    "profile": "https://www.pystone.net/profile/"
  },
  "aliases": [],
  "summary": "C++ std::map 与 std::unordered map 的区别",
  "contentRole": "unspecified",
  "isMoc": false,
  "mocRecognition": "none",
  "generated": false,
  "attribution": "unspecified",
  "domain": "10-计算机、信息技术与工程",
  "tags": [],
  "mocs": [],
  "contentHash": "b1ede23eca15db9ce678f18338129830217ba518a71b009bd061615bcaa03fcd",
  "assets": [],
  "headings": [
    {
      "depth": 1,
      "text": "C++ std::map 与 std::unorderedmap 的区别",
      "anchor": "c-stdmap-与-stdunorderedmap-的区别",
      "citation": "https://www.pystone.net/notes/cpp-map-vs-unordered-map/#c-stdmap-%E4%B8%8E-stdunorderedmap-%E7%9A%84%E5%8C%BA%E5%88%AB"
    },
    {
      "depth": 2,
      "text": "核心差异",
      "anchor": "核心差异",
      "citation": "https://www.pystone.net/notes/cpp-map-vs-unordered-map/#%E6%A0%B8%E5%BF%83%E5%B7%AE%E5%BC%82"
    },
    {
      "depth": 2,
      "text": "如何选择",
      "anchor": "如何选择",
      "citation": "https://www.pystone.net/notes/cpp-map-vs-unordered-map/#%E5%A6%82%E4%BD%95%E9%80%89%E6%8B%A9"
    },
    {
      "depth": 2,
      "text": "常用控制项",
      "anchor": "常用控制项",
      "citation": "https://www.pystone.net/notes/cpp-map-vs-unordered-map/#%E5%B8%B8%E7%94%A8%E6%8E%A7%E5%88%B6%E9%A1%B9"
    },
    {
      "depth": 2,
      "text": "参考资料",
      "anchor": "参考资料",
      "citation": "https://www.pystone.net/notes/cpp-map-vs-unordered-map/#%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99"
    }
  ],
  "claims": [],
  "outgoing": [],
  "incoming": [
    {
      "id": "note:programming-languages-and-runtimes",
      "title": "编程语言与运行时",
      "url": "https://www.pystone.net/notes/programming-languages-and-runtimes/",
      "atlas": "https://www.pystone.net/?node=programming-languages-and-runtimes#knowledge-atlas",
      "label": "编程语言与运行时",
      "origin": "explicit",
      "humanReviewed": true,
      "context": "std-map与std-unorderedmap的区别",
      "citation": "https://www.pystone.net/notes/programming-languages-and-runtimes/#c"
    }
  ],
  "contentMarkdown": "# C++ `std::map` 与 `std::unordered_map` 的区别\n\n> [!note] 名称\n> C++ 标准库没有名为 `hashmap` 的标准容器；对应的哈希关联容器是 `std::unordered_map`。\n\n## 核心差异\n\n| 维度 | `std::map` | `std::unordered_map` |\n| --- | --- | --- |\n| 组织方式 | 有序关联容器，通常由平衡搜索树实现 | 无序关联容器，通常由哈希表实现 |\n| 键顺序 | 按比较器排序 | 没有稳定的键顺序保证 |\n| 查找/插入/删除 | `O(log n)` | 平均 `O(1)`，最坏 `O(n)` |\n| 范围查询 | 支持 `lower_bound`、有序遍历 | 不适合按键范围查询 |\n| 主要失效条件 | 删除元素使被删元素的迭代器失效 | rehash 可使所有迭代器失效 |\n| 额外要求 | 键需要严格弱序比较 | 键需要哈希函数与相等判断一致 |\n\n标准规定的是行为和复杂度要求，不强制某一种底层数据结构。常见实现中 `map` 使用红黑树，`unordered_map` 使用桶数组与链式/节点结构，但不应把实现细节当成跨平台保证。\n\n## 如何选择\n\n选择 `std::map`：\n\n- 需要按键排序遍历；\n- 需要范围查询或相邻键；\n- 希望复杂度有稳定的对数上界；\n- 无法提供可靠、廉价的哈希函数。\n\n选择 `std::unordered_map`：\n\n- 主要是精确键查询；\n- 不依赖遍历顺序；\n- 哈希分布可控，且平均常数时间带来实际收益。\n\n哈希表不一定更快：小数据量、缓存局部性、节点分配、哈希成本、负载因子和碰撞都会影响结果。应使用真实键和值在目标平台做基准测试。\n\n## 常用控制项\n\n```cpp\n#include <unordered_map>\n\nstd::unordered_map<int, int> values;\nvalues.reserve(1000);       // 预计元素数，减少 rehash\nvalues.max_load_factor(0.8f);\n```\n\n自定义键时，若 `a == b`，哈希函数必须保证两者哈希值相同；反过来哈希值相同不要求键相等。\n\n## 参考资料\n\n- [Microsoft Learn：`map` class](https://learn.microsoft.com/en-us/cpp/standard-library/map-class?view=msvc-170)\n- [Microsoft Learn：`unordered_map` class](https://learn.microsoft.com/en-us/cpp/standard-library/unordered-map-class?view=msvc-170)\n"
}
