新闻中心

c++ set容器用法 c++ set去重原理详解

2025-11-30
浏览次数:
返回列表
set能自动去重并保持有序,其底层通常采用红黑树实现;插入时通过比较操作查找位置,若元素已存在(即互不小于对方)则插入失败,从而保证唯一性;支持自定义类型需提供比较规则,适用于需要有序且唯一数据的场景。

c++ set容器用法 c++ set去重原理详解

在C++中,set 是一个非常实用的关联式容器,常用于自动去重和保持元素有序。它属于STL(标准模板库)的一部分,定义在 头文件中。

set的基本用法

set 容器内部存储唯一且按升序排列的元素。默认情况下,使用 operator 进行比较,因此元素必须支持比较操作。

常见操作示例:

  • 插入元素:使用 insert() 方法,重复插入相同值不会生效。
  • 删除元素:使用 erase(),可传值或迭代器。
  • 查找元素:使用 find(),返回迭代器,未找到则返回 end()。
  • 判断是否为空:empty()。
  • 获取大小:size()。

代码示例:

#include <set>
#include <iostream>

int main() {
    std::set<int> s;
    s.insert(5);
    s.insert(3);
    s.insert(5); // 重复,插入无效

    for (const auto& x : s) {
        std::cout << x << " "; // 输出:3 5
    }

    if (s.find(3) != s.end()) {
        std::cout << "\n3 存在";
    }

    return 0;
}

set去重的原理

set 能自动去重,根本原因在于其底层数据结构——通常实现为自平衡二叉搜索树(如红黑树)。

当调用 insert 插入元素时,set 会:

  • 从根节点开始,按照比较规则(默认小于)查找插入位置。
  • 如果发现已有相同值的节点(即 !a
  • 此时插入失败,不修改容器,返回已存在节点的迭代器。

由于 set 要求元素“严格弱排序”,而“相等”被定义为:
两个元素 a 和 b 相等,当且仅当 a 且 b 。
这与 == 不同,但能保证唯一性。

自定义类型如何使用set

若要将自定义类型放入 set,必须提供比较方式。

GoEnhance GoEnhance

全能AI视频制作平台:通过GoEnhance AI让视频创作变得比以往任何时候都更简单。

GoEnhance 347 查看详情 GoEnhance

可以通过重载 操作符,或传入比较函数对象。

示例:使用 struct 自定义比较

struct Person {
    int age;
    std::string name;
    
    bool operator<(const Person& other) const {
        return age < other.age; // 按年龄排序,自动去重
    }
};

std::set<Person> people;
people.insert({25, "Alice"});
people.insert({25, "Bob"}); // 若只比 age,则视为重复

注意:上述例子中,两个 age=25 的 Person 可能被视为相同。若需更精确去重,应在比较逻辑中加入 name 或其他字段。

set与其他容器对比

相比 vector 或 list,set 插入、删除、查找时间复杂度为 O(log n),虽然比哈希表慢,但能保持有序。

如果不需要排序,只想快速去重,可以考虑 unordered_set,它基于哈希表,平均操作为 O(1)。

基本上就这些。set 的去重能力来自其有序结构和插入时的重复检测机制,理解这一点有助于合理选择容器。

以上就是c++++ set容器用法 c++ set去重原理详解的详细内容,更多请关注其它相关文章!


# 解决方法  # 宁波公司建设网站  # 湖北seo外包系统  # 大渡口区的网站推广  # 沧州网站建设 网络服务  # 医院网站建设与维护题库  # 闲鱼怎么测关键词排名  # 小学网站建设及使用  # 前台营销推广协助  # 白城seo查询怎么样  # 黄埔网站建设报价  # 升序  # 红黑  # 但能  # c++ set  # 尼克  # 重写  # 有什么  # 数据结构  # 迭代  # 自定义  # red  # 排列  # stream  # ios  # c++  # ai  # c++去重 


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


相关推荐: AO3网页版最新入口合集 Archive of Our Own在线访问指南  ACG动漫视频网入口 ACG动漫*免费正版观看地址  腾讯QQ邮箱官方网站_QQ邮箱网页版在线登录  探索高级语言到C/C++的转译路径:以Go为例及内存管理策略  Yandex官网免登录入口_俄罗斯Yandex搜索引擎一键访问  小米汽车11月交付量突破40000台!雷军:将继续努力  Composer如何处理Git子模块(submodule)依赖_Composer与Git Submodule的对比与选择  在Go开发中优雅管理ListenAndServe进程:GoSublime集成方案  实现分段式页面滚动导航:CSS与J*aScript教程  深入理解Google Cloud Datastore查询:祖先路径与数据一致性  一加 Nord 5 隐私权限异常_一加 Nord 5 系统安全优化  AO3最新可访问网址 Archive of Our Own官方在线入口  QQ邮箱登录平台入口 QQ邮箱网页版邮箱官方入口  Yandex官网搜索引擎免登录_俄罗斯Yandex一键直达入口  网易大神怎么保存别人动态的图片_网易大神动态图片保存方法  J*a TimerTask文件监控:HashMap状态管理与常见陷阱规避指南  蛙漫2日版入口 WAMAN2(日版)无删减漫画官网链接  天猫2025双十一0点秒杀攻略 天猫爆款抢购时间  J*a递归快速排序中静态变量导致数据累积的陷阱与解决方案  Steam官网入口直达 Steam注册及登录步骤  ArrayList与LinkedList操作复杂度详解:遍历与修改  J*aScript map 方法中处理循环元素为空数组的策略  Archive of Our Own官网直达 AO3最新可用地址一览  怎么在mac上运行html代码_mac运行html代码方法【指南】  Windows电脑怎么截图最方便_系统自带截图工具的5种神仙用法【技巧】  KFC早餐时段怎么领特惠代码_KFC早餐订餐优惠代码获取与使用说明  QQ邮箱官方登录入口_QQ邮箱网页版快捷使用平台  sublime侧边栏怎么增强功能_SideBarEnhancements for sublime安装与配置  Tabulator表格日期时间排序问题及自定义解决方案  整合Supabase认证与Django模型:跨模式迁移的解决方案  迅雷下载到U盘速度很慢怎么办_迅雷U盘下载慢优化方法  TikTok网页版直接登录 TikTok网页端官方平台入口  qq游戏免费畅玩入口_qq游戏电脑版快速启动  J*a里如何实现线程安全的懒加载单例_懒加载单例实现方法解析  如何在Promise链中有效终止错误处理后的执行  正确连接J*aScript到HTML实现可点击图片与自定义事件处理  《主播少女的秘密账号迷宫》首支宣传片  ACG动漫手机版官网入口 手机ACG动漫APP在线观看正版  Python Socket多播通信中指定源IP地址的实践指南  PHP中获取MongoDB服务器运行时间(Uptime)的专业指南  漫蛙MANWA漫画主页官方入口 漫蛙漫画最新在线阅读地址  composer 和 npm/yarn 在管理依赖方面有什么核心思想差异?  C++如何打印当前代码行号与文件名_C++预定义宏FILE与LINE的使用  谷歌邮箱注册显示错误Gmail服务器异常与延迟处理  高德地图家和公司地址在哪设置 高德地图通勤路线设置方法【超详细】  中兴BladeV30怎样用测距估书架层高_iPhone中兴BladeV30测距估书架层高【家装参考】  海棠电脑版入口_通过电脑访问海棠官网阅读  mysql备份恢复性能优化_mysql备份恢复性能优化方法  qq邮箱发邮件给国外发不出去_QQ邮箱国际邮件发送失败原因与解决  PHP中高效并行检查多链接状态的教程 

搜索