0

0

C++怎么使用set C++中set容器去重和排序【科普】

裘德小鎮的故事

裘德小鎮的故事

发布时间:2026-03-14 20:46:02

|

199人浏览过

|

来源于php中文网

原创

std::set通过红黑树实现自动去重和升序排序,插入重复元素静默忽略;支持自定义比较器(如降序或结构体),但排序规则必须构造时确定;emplace推荐日常使用,insert适用于已存在对象,emplace_hint需谨慎使用;纯去重用unordered_set,小数据量可选vector+sort,仅需极值考虑priority_queue。

c++怎么使用set c++中set容器去重和排序【科普】

set 自动去重和排序是怎么回事

你往 std::set 里插重复元素,它直接不收——不是报错,也不是覆盖,是静默忽略。这不是 bug,是设计:set 的底层是红黑树,每个节点的 key 必须唯一,且天然按 operator<(或自定义比较器)升序排列。

所以别写循环手动查重再插入;也别插完再调 std::sort——set 插入即有序,O(log n) 每次,总代价比先插 vector 再 sort 低得多(尤其增量插入场景)。

  • 默认用 std::less<T>,也就是 T::operator<,对 int、string 等内置/常见类型开箱即用
  • 插入重复值(比如两次 s.insert(5))返回 std::pair<iterator, bool>.second == false 表示没插进去
  • 不能用下标访问(s[0] 非法),要遍历或用 *s.begin() 取最小值

怎么自定义排序规则(比如降序或结构体)

set 不接受「先插后排序」,排序逻辑必须在构造时定死。改规则 ≠ 改数据,得换比较器。

常见错误是以为能用 std::sort(s.begin(), s.end(), ...)——不行,set 没有随机迭代器,begin() 返回的是双向迭代器,不支持 std::sort

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

Insou AI
Insou AI

Insou AI 是一款强大的人工智能助手,旨在帮助你轻松创建引人入胜的内容和令人印象深刻的演示。

下载
  • 降序:传 std::greater<int>,如 std::set<int, std::greater<int>> s;
  • 结构体:必须提供可调用对象(lambda、函数指针、仿函数类),且满足严格弱序。例如:
    struct Person {
        string name;
        int age;
    };
    auto cmp = [](const Person& a, const Person& b) { return a.age < b.age; };
    std::set<Person, decltype(cmp)> s(cmp);
  • 注意:比较器对象必须能拷贝,lambda 若捕获变量([&x]{...})就不能用于模板参数,得用仿函数类

insert / emplace / emplace_hint 性能差别在哪

三者都保证去重,但内部动作不同:insert 是「构造再移动/拷贝」,emplace 是「就地构造」,emplace_hint 则试图用提示位置加速查找——但提示错反而更慢。

实际中,除非你刚查过某个位置(比如 find 返回的 iterator),否则别用 emplace_hint。它不是优化银弹,是特定场景的微调手段。

  • s.insert(value):适用于已存在对象,或 move-only 类型(如 std::unique_ptr
  • s.emplace(args...):推荐日常使用,避免临时对象构造+移动,比如 s.emplace("Alice", 28) 直接构造 Person
  • s.emplace_hint(hint, args...):hint 应该是「大概率靠近插入位置」的 iterator,比如上一次插入返回的 it,乱传会拖慢性能

什么时候不该用 set

set 强在去重+有序,但代价是每次操作 O(log n),且内存开销比 vector 大(每个节点额外存左右子节点指针)。如果只是临时去重,之后还要随机访问或频繁修改,它可能不是最优解。

  • 纯去重不要排序?用 std::unordered_set,平均 O(1) 插入,但无序
  • 数据量小(< 50 个)且只插一次?vector + std::unique + std::sort 更快,cache 友好
  • 需要按插入顺序遍历?set 不行,考虑 std::vector 加手写去重逻辑,或用 std::unordered_set 记录已见元素
  • 频繁查找最大/最小值?set 的 begin()/rbegin() 是 O(1),但若只关心极值,std::priority_queue 或 pair + 手动维护可能更轻量

最常被忽略的一点:set 迭代器失效规则和 vector 完全不同——只有删除元素会使对应迭代器失效,插入绝不会使其他迭代器失效。这点在写循环遍历时很关键,别套用 vector 的经验。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Sass和less的区别
Sass和less的区别

Sass和less的区别有语法差异、变量和混合器的定义方式、导入方式、运算符的支持、扩展性等。本专题为大家提供Sass和less相关的文章、下载、课程内容,供大家免费下载体验。

216

2023.10.12

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1051

2023.08.02

sort排序函数用法
sort排序函数用法

sort排序函数的用法:1、对列表进行排序,默认情况下,sort函数按升序排序,因此最终输出的结果是按从小到大的顺序排列的;2、对元组进行排序,默认情况下,sort函数按元素的大小进行排序,因此最终输出的结果是按从小到大的顺序排列的;3、对字典进行排序,由于字典是无序的,因此排序后的结果仍然是原来的字典,使用一个lambda表达式作为key参数的值,用于指定排序的依据。

409

2023.09.04

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

490

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

202

2025.07.04

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

490

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

202

2025.07.04

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1051

2023.08.02

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

49

2026.03.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 11.3万人学习

C 教程
C 教程

共75课时 | 5.4万人学习

C++教程
C++教程

共115课时 | 21.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号