Namespaces
Variants

std:: unordered_set

From cppreference.net
定义于头文件 <unordered_set>
template <

class Key,
class Hash = std:: hash < Key > ,
class KeyEqual = std:: equal_to < Key > ,
class Allocator = std:: allocator < Key >

> class unordered_set ;
(1) (C++11 起)
namespace pmr {

template <
class Key,
class Hash = std:: hash < Key > ,
class Pred = std:: equal_to < Key >
> using unordered_set = std :: unordered_set < Key, Hash, Pred,
std:: pmr :: polymorphic_allocator < Key >> ;

}
(2) (C++17 起)

std::unordered_set 是一个关联容器,包含一组类型为 Key 的唯一对象。搜索、插入和删除操作具有平均常数时间复杂度。

在内部,元素不会按特定顺序排序,而是被组织到多个桶中。元素被分配到哪个桶完全取决于其值的哈希值。这样可以快速访问单个元素,因为一旦计算出哈希值,就能直接定位到元素所在的精确桶。

容器元素可能无法被修改(即使通过非 const 迭代器),因为修改可能会改变元素的哈希值并破坏容器。

std::unordered_set 满足 Container AllocatorAwareContainer UnorderedAssociativeContainer 的要求。

std::unordered_set 的所有成员函数均为 constexpr :可以在常量表达式求值过程中创建和使用 std::unordered_set 对象。

然而, std::unordered_set 对象通常不能声明为 constexpr ,因为任何动态分配的存储必须在同一常量表达式求值过程中释放。

(C++26 起)

目录

迭代器失效

操作 失效情况
所有只读操作、 swap std::swap 永不失效
clear rehash reserve operator= 始终失效
insert emplace emplace_hint 仅当引发重哈希时失效
erase 仅被擦除元素失效

注释

  • swap函数不会使容器内的任何迭代器失效,但会使标记交换区域末尾的迭代器失效。
  • 指向容器中存储数据的引用和指针仅在该元素被删除时才会失效,即使对应的迭代器已失效也是如此。
  • 容器移动赋值后,除非因分配器不兼容强制进行逐元素移动赋值,否则被移动容器的引用、指针和迭代器(尾后迭代器除外)保持有效,但会指向现在位于 * this 中的元素。

模板参数

成员类型

类型 定义
key_type Key
value_type Key
size_type 无符号整数类型(通常为 std::size_t
difference_type 有符号整数类型(通常为 std::ptrdiff_t
hasher Hash
key_equal KeyEqual
allocator_type Allocator
reference value_type &
const_reference const value_type &
pointer std:: allocator_traits < Allocator > :: pointer
const_pointer std:: allocator_traits < Allocator > :: const_pointer
iterator 指向 value_type 的常量 LegacyForwardIterator ConstexprIterator (C++26 起)
const_iterator 指向 const value_type LegacyForwardIterator ConstexprIterator (C++26 起)
local_iterator 迭代器类型,其类别、值类型、差值类型、指针类型
和引用类型与 iterator 相同。此迭代器
可用于遍历单个桶但不能跨桶遍历
const_local_iterator 迭代器类型,其类别、值类型、差值类型、指针类型
和引用类型与 const_iterator 相同。此迭代器
可用于遍历单个桶但不能跨桶遍历
node_type (C++17 起) node handle 的特化,表示容器节点
insert_return_type (C++17 起) 描述插入 node_type 结果的类型,

template < class Iter, class NodeType >
struct /*unspecified*/
{
Iter     position ;
bool inserted ;
NodeType node ;
} ;

使用模板参数 iterator node_type 实例化的特化。

成员函数

构造 unordered_set
(公开成员函数)
析构 unordered_set
(公开成员函数)
为容器赋值
(公开成员函数)
返回关联的分配器
(公开成员函数)
迭代器
返回指向起始位置的迭代器
(公开成员函数)
返回指向末尾的迭代器
(公开成员函数)
容量
检查容器是否为空
(公开成员函数)
返回元素数量
(公开成员函数)
返回可能容纳的最大元素数量
(公开成员函数)
修饰符
清空内容
(公开成员函数)
插入元素 或节点 (C++17 起)
(公开成员函数)
插入一个元素范围
(公开成员函数)
原地构造元素
(公开成员函数)
使用提示原位构造元素
(公开成员函数)
删除元素
(公开成员函数)
交换内容
(公开成员函数)
(C++17)
从容器中提取节点
(公开成员函数)
(C++17)
从另一容器接合节点
(公开成员函数)
查找
返回匹配特定键的元素数量
(公开成员函数)
查找具有特定键的元素
(公开成员函数)
(C++20)
检查容器是否包含具有特定键的元素
(公开成员函数)
返回匹配特定键的元素范围
(公开成员函数)
桶接口
返回指向指定存储桶起始位置的迭代器
(公开成员函数)
返回指向指定存储桶末尾的迭代器
(公开成员函数)
返回桶的数量
(公开成员函数)
返回最大桶数量
(公开成员函数)
返回特定桶中的元素数量
(公开成员函数)
返回特定键对应的桶
(公开成员函数)
哈希策略
返回每个桶的平均元素数量
(公开成员函数)
管理每个桶的最大平均元素数量
(公开成员函数)
预留至少指定数量的桶并重新生成哈希表
(公开成员函数)
预留至少指定数量元素的存储空间并重新生成哈希表
(公开成员函数)
观察器
返回用于哈希键的函数
(公开成员函数)
返回用于比较键是否相等的函数
(公开成员函数)

非成员函数

(C++11) (C++11) (removed in C++20)
比较 unordered_set 中的值
(函数模板)
特化 std::swap 算法
(函数模板)
擦除满足特定条件的所有元素
(函数模板)

推导指引

(C++17 起)

注释

成员类型 iterator const_iterator 可能是同一类型的别名。这意味着使用这两种类型作为参数类型来定义一对函数重载可能违反 One Definition Rule 。由于 iterator 可转换为 const_iterator ,使用单个以 const_iterator 作为参数类型的函数即可替代。

功能测试 标准 功能
__cpp_lib_containers_ranges 202202L (C++23) 容器的范围构造与插入
__cpp_lib_constexpr_unordered_set 202502L (C++26) constexpr std::unordered_set

示例

#include <iostream>
#include <unordered_set>
void print(const auto& set)
{
    for (const auto& elem : set)
        std::cout << elem << ' ';
    std::cout << '\n';
}
int main()
{
    std::unordered_set<int> mySet{2, 7, 1, 8, 2, 8}; // 创建整型集合
    print(mySet);
    mySet.insert(5); // 向集合中插入元素5
    print(mySet);
    if (auto iter = mySet.find(5); iter != mySet.end())
        mySet.erase(iter); // 删除迭代器指向的元素
    print(mySet);
    mySet.erase(7); // 删除元素7
    print(mySet);
}

可能的输出:

8 1 7 2
5 8 1 7 2
8 1 7 2
8 1 2

缺陷报告

以下行为变更缺陷报告被追溯应用于先前发布的C++标准。

DR 适用版本 发布行为 正确行为
LWG 2050 C++11 reference const_reference pointer
const_pointer 的定义基于 allocator_type
基于 value_type
std::allocator_traits

另请参阅

键的集合,通过键进行哈希存储
(类模板)
唯一键的集合,按键排序
(类模板)
(C++23)
适配容器以提供唯一键的集合,按键排序
(类模板)