讲师中心 微信公众号
AI工具推荐 视频效率加速

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

阿晨吖_3793

阿晨吖_3793

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

|

219人浏览过

|

来源于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++免费学习笔记(深入)”;

C++ Code Review Master
C++ Code Review Master

组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。

下载
  • 降序:传 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工具

更多
咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

相关专题

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

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

2447

2023.10.12

string转int
string转int

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

5739

2023.08.02

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

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

1118

2023.09.04

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

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

4334

2025.06.09

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

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

4471

2025.07.04

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

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

4334

2025.06.09

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

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

4471

2025.07.04

string转int
string转int

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

5739

2023.08.02

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

100

2026.09.30

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Conan 2 Essentials 免费课程
Conan 2 Essentials 免费课程

共0课时 | 0人学习

CMake 与 Conan 集成实践
CMake 与 Conan 集成实践

共0课时 | 0人学习

Conan 2 高级依赖模型介绍
Conan 2 高级依赖模型介绍

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn