C++ 中哪些 STL 类型可以作为 map 或 unordered_map 的键?

其实是在问哪些类型有 hash 函数和重载了 < 比较操作符。因为说的是 STL,所以不考虑内建类型。

可哈希和 == 比较

常见的可以哈希和 == 比较的集合类型有(以下省略 std 命名空间):

  • string / string_view
  • bitset
  • unique_ptr / shared_ptr

这样的标准库模板类其实非常少!通常,可以用于 hash 和相等的类型都能用于 < 比较

注意 map 和 set 通常不可哈希!包括:

  • flat_map / flat_set (C++23)
  • map / set
  • unordered_map / unordered_set

< 比较

常见的可以用于 < 比较的集合类型除了 可哈希和 == 比较 给出的几个类型之外 ,还有:

  • vector
  • pair / tuple / arrayarraypair 都可以看成是特殊的 tuple
  • deque / queue / stack(不包括 priority_queue
  • list / forward_list
  • map / set