C++,STL容器 unordered_set/unordered_multiset:无序集合/无序多重集合深入解析

请添加图片描述


一、容器概览与核心特性

unordered_setunordered_multiset是C++11引入的哈希容器,以平均O(1)时间复杂度提供快速元素访问能力。与有序容器set/multiset不同,它们通过哈希表实现,不维护元素顺序,适用于需要高频查找但无需排序的场景。


核心特性对比

特性 unordered_set unordered_multiset
元素唯一性 唯一 允许重复
插入复杂度 平均O(1),最差O(n) 同左
查找复杂度 平均O(1),最差O(n) 同左
内存布局 散列存储 散列存储
头文件 <unordered_set> <unordered_set>

二、底层实现原理:哈希表机制

1. 哈希表核心组件

  • 哈希函数:将元素映射到桶索引(hash(key) % bucket_count

  • 桶数组:存储链表头指针(开链法解决冲突)

  • 负载因子元素数 / 桶数,触发自动rehash(默认阈值1.0)


    // 哈希表节点结构示意(开链法)
    template <typename T>
    struct HashNode {
   
        T value;              // 存储元素值
        HashNode* next;       // 指向下一个节点
        size_t cached_hash;   // 缓存哈希值(优化多次哈希计算)
    };

2. 哈希冲突处理

当不同元素映射到同一桶时,采用链表法处理冲突。C++标准库采用单向链表实现,插入新元素时采用头插法(时间复杂度O(1))。


三、核心操作详解

1. 容器初始化与配置


    // 默认初始化(使用默认哈希和相等比较)
    unordered_set<string> names;  

    // 预分配100个桶 + 自定义哈希函数
    struct Point {
    int x, y; };
    struct PointHash {
   
        size_t operator()(const Point& p) const {
   
            return hash<int>()(p.x) ^ (hash<int>()(p.y) << 1);
        }
    };

    unordered_set<Point, PointHash> points(100);

    // 设置最大负载因子为0.75
    points.max_load_factor(0.75);

2. 元素插入与去重


    unordered_set<int> uniqueNums;
    auto [iter, inserted] = uniqueNums.insert(42);  // C++17结构化绑定
    if (inserted) cout << "插入成功"; 

    // 批量插入(忽略重复)
    vector<int> data {
   1, 2, 2, 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智驾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值