新闻中心

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

2025-11-14
浏览次数:
返回列表
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)。

选择依据:

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

set 使用示例

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

Reachout.ai Reachout.ai

一个AI驱动的视频开发平台,专为忙碌的企业家和销售团队打造

Reachout.ai 142 查看详情 Reachout.ai #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++集合容器区别与用法示例的详细内容,更多请关注其它相关文章!


# 边缘  # 云推网站seo优化  # 汕头实体店推广招聘网站  # 溧水区网站优化外包公司  # 学院网站建设 需求分析  # 深圳网站优化设计高中  # 新沂徐州网站建设推广  # 寻甸营销推广售后服务  # seo网站优化的步骤和技巧  # 绥化seo是什么方案  # 锦州网站优化排名软件  # 遍历  # 不需要  # 升序  # ai  # 特化  # 红黑  # 都是  # 如何使用  # 自定义  # 游戏开发  # red  # 排列  # 区别  # stream  # ios  # c++ 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: taptap防沉迷怎么解除 taptap解除健康系统限制说明【2025最新】  文心一言怎样用插件调度API数据_文心一言用插件调度API数据【API调用】  J*aScript对象创建方式_J*aScript设计模式应用  Lar*el Form Request中唯一性验证在更新操作中的正确实现  蛙漫2台版漫画地址 Manwa2正版网页版链接  c++中的std::basic_string的SSO优化_c++短字符串优化深度解析  解决Python logging 中 datefmt 导致时间戳固定不变的问题  微信怎么把收藏的内容分类管理 微信收藏内容标签分类方法  护手霜蹭到袖口上了如何清洗? 怎样避免留下一圈油印?  J*aScript中在Map循环中检测并处理空数组元素  天眼查怎么看公司融资情况 天眼查企业融资历史查询步骤【攻略】  智慧团建扫码登录入口 智慧团建扫码登录入口官网版​  在J*a中如何使用BigDecimal进行高精度计算_BigDecimal类应用指南  Yandex浏览器官方网页版入口 Yandex浏览器最新版官网  如何使 Jest 模拟函数默认抛出错误以提高测试效率  PostgreSQL海量数据高效导入策略:Python与Django实践指南  c++如何使用chrono库处理时间_c++标准库时间与日期操作  c++ 获取系统当前时间 c++时间戳获取方法  css元素hover动画延迟生效怎么办_使用animation-delay调整触发时间  漫蛙2(台版)官方入口地址 漫蛙2(台版)正版漫画网页端  XML中包含HTML标签导致解析错误? 正确嵌入非XML数据的两种方法  sublime怎么覆盖插件的默认快捷键_sublime快捷键优先级与设置  生成rdflib自定义SPARQL函数:参数匹配与实践指南  天猫2025双十一0点秒杀攻略 天猫爆款抢购时间  PDO预处理语句中冒号的正确处理:区分SQL函数格式与命名占位符  “在文档元素之后找到了标记”是什么错误? 检查并修复XML中多个根元素的3个方法  微信网页版扫码登录入口 微信网页版二维码登录入口  Win11怎么安装Linux子系统 Win11 WSL2安装Ubuntu及环境配置指南  新手怎么开始学化妆 零基础化妆入门教程  蛙漫正版漫画平台入口_蛙漫免费阅读全站漫画资源  CSS自定义字体样式被系统字体替换怎么办_font-face方式指定font-display控制渲染策略  深入理解Promise链:如何在catch后中断then的执行  c++如何使用折叠表达式(Fold Expressions)_c++17可变参数模板新技巧  痛风发作了怎么办? 快速止痛和后期饮食调理  如何有效阻止外部脚本意外修改内联样式的高度属性  小红书怎么解除第三方平台绑定_小红书多平台登录解绑方法介绍  解决Tabulator日期时间排序问题的专业指南  vivo手机参数配置怎么增强信号_vivo手机参数配置信号增强方法  Animex动漫社网入口地址 Animex动漫社网正版在线入口  谷歌浏览器如何快速清除某个网站的数据_Chrome网站缓存清理方法  Win10系统服务哪些可以禁用 Win10安全优化服务列表【干货】  TikTok国际版网页端快速入口 TikTok全球版短视频浏览教程  Shopware订单对象中获取产品自定义字段的正确方法  PHP高效扁平化嵌套数组:使用array_merge与数组解包操作符  Win11怎么开启高性能模式_Windows 11电源计划优化设置  mc.js官网登录入口 mc.js官方登录入口最新版  wps文字怎么插入目录并自动更新_wps文字如何插入目录并自动更新方法  谷歌学术网站直达地址 谷歌学术搜索网页版一键进入  C++如何打印当前代码行号与文件名_C++预定义宏FILE与LINE的使用  mcjs网页版流畅运行 mcjs低配电脑畅玩入口 

搜索