C++如何使用set和unordered_set_C++集合容器区别与用法示例

set基于红黑树实现,元素有序,操作复杂度O(log n);unordered_set基于哈希表,无序但平均O(1),需根据是否需要排序选择。

c++如何使用set和unordered_set_c++集合容器区别与用法示例

在C++中,setunordered_set 都是标准模板库(STL)提供的关联容器,用于存储唯一的元素。它们的核心功能相似,但在底层实现、性能特征和使用场景上有明显区别

set 与 unordered_set 的主要区别

set 基于红黑树(一种自平衡二叉搜索树)实现,元素自动按升序排列。插入、删除和查找的时间复杂度为 O(log n)。

unordered_set 基于哈希表实现,元素无固定顺序。理想情况下插入、删除和查找操作接近 O(1),最坏情况可能退化到 O(n)。

选择依据:

立即学习“C++免费学习笔记(深入)”;

需要有序遍历 → 使用 set 追求最快平均查找速度且不需要排序 → 使用 unordered_set 自定义类型需提供比较函数(set)或哈希函数(unordered_set)

set 使用示例

set 会自动对元素进行排序,并保证唯一性。

#include iostream>
#include
using namespace std;

int main() {
    set s;
    s.insert(5);
    s.insert(1);
    s.insert(3);
    s.insert(5); // 重复元素不会被插入

    cout     for (int x : s) {
        cout     }
    cout
    if (s.find(3) != s.end()) {
        cout     }

    s.erase(1);
    cout     for (int x : s) cout     cout
    return 0;
}

unordered_set 使用示例

unordered_set 不保证顺序,但通常具有更快的访问速度。

#include stream>
#include
using namespace std;

int main() {
    unordered_set us;
    us.insert(5);
    us.insert(1);
    us.insert(3);
    us.insert(5); // 重复,不插入

    cout     for (int x : us) {
        cout     }
    cout
    if (us.count(3)) {
        cout     }

    us.erase(1);
    cout
    return 0;
}

自定义类型的支持

若要在 set 中使用自定义类型,需提供比较函数;对于 unordered_set,需提供哈希函数。

例如定义一个结构体 Person:

struct Person {
    string name;
    int age;
    bool operator==(const Person& p) const {
        return name == p.name && age == p.age;
    }
};

// set 需要小于比较
struct ComparePerson {
    bool operator()(const Person& a, const Person& b) const {
        if (a.name != b.name) return a.name         return a.age     }
};

// unordered_set 需要哈希特化
struct HashPerson {
    size_t operator()(const Person& p) const {
        return hash{}(p.name) ^ (hash{}(p.age)     }
};

// 使用方式:
set people_set;
unordered_set people_unordered;基本上就这些。根据是否需要有序和性能要求来选择合适的容器。

以上就是C++如何使用set和unordered_set_C++集合容器区别与用法示例的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1483974.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月19日 07:43:02
下一篇 2025年12月19日 07:43:14

相关推荐

发表回复

登录后才能评论
关注微信