c++数据结构9——set结构详解

article/2025/7/1 14:55:41

一、set以二叉查找树为基础

二叉查找树(Binary Search Tree,BST)是一种特殊的二叉树结构,具有以下特点:

  1. 左子树所有节点值小于根节点值

  2. 右子树所有节点值大于根节点值

  3. 左右子树也都是二叉查找树

图例:

       8/   \3     10/ \      \1   6      14/ \    /4   7  13

重要特性:二叉查找树的中序遍历结果是一个有序序列(升序排列)

二、STL中的set容器

1.set基本概念

  • set是C++标准模板库(STL)中的关联容器

  • 基于红黑树(自平衡二叉查找树)实现

  • 三大特性:

    1. 自动排序(默认升序)

    2. 元素唯一(自动去重)

    3. 高效操作(查找、插入、删除时间复杂度O(log n))

2.set的定义与初始化

#include <set>  // 必须包含的头文件// 定义set的基本语法
set<数据类型> 集合名称;// 示例:定义一个整型set
set<int> mySet;

3.set的常用成员函数

函数功能描述时间复杂度
insert(value)插入元素O(log n)
erase(value)删除元素O(log n)
find(value)查找元素O(log n)
size()返回元素个数O(1)
empty()判断是否为空O(1)
clear()清空集合O(n)
begin()返回起始迭代器O(1)
end()返回结束迭代器O(1)

三、set迭代器的使用

1.迭代器基本概念

  • 迭代器类似于指针,用于遍历容器元素

  • set迭代器是双向迭代器(支持++和--操作)

  • 不支持随机访问(不能使用+/-操作符)

2.迭代器定义语法

set<数据类型>::iterator 迭代器名称;

3.遍历set的三种方法

  1. 传统迭代器遍历

set<int> s = {3, 1, 4, 1, 5, 9};for(set<int>::iterator it = s.begin(); it != s.end(); it++) {cout << *it << " ";  // 输出: 1 3 4 5 9
}

    2.C++11范围for循环

for(auto num : s) {cout << num << " ";  // 输出: 1 3 4 5 9
}

    3.反向迭代器遍历

for(set<int>::reverse_iterator rit = s.rbegin(); rit != s.rend(); rit++) {cout << *rit << " ";  // 输出: 9 5 4 3 1
}

四、set操作详解与示例

1. 插入元素

set<int> s;
s.insert(5);  // 插入单个元素
s.insert({2, 8, 3, 5});  // 插入多个元素(重复元素5会被忽略)// 输出: 2 3 5 8
for(int num : s) {cout << num << " ";
}

2. 查找元素

set<int> s = {1, 3, 5, 7, 9};// 使用find函数查找元素
auto it = s.find(5);  
if(it != s.end()) {cout << "找到元素: " << *it << endl;
} else {cout << "未找到元素" << endl;
}// 使用count函数检查存在性
if(s.count(4)) {cout << "元素4存在" << endl;
} else {cout << "元素4不存在" << endl;
}

3. 删除元素

set<int> s = {1, 2, 3, 4, 5, 6};// 删除指定值
s.erase(3); // 删除迭代器指向的元素
auto it = s.find(5);
if(it != s.end()) {s.erase(it);
}// 删除范围元素
s.erase(s.begin(), next(s.begin(), 2));  // 删除前两个元素// 输出剩余元素: 4 6
for(int num : s) {cout << num << " ";
}

五、应用实例:统计不同数字个数

问题描述

输入n个整数,输出其中不同数字的个数

输入样例

5
1 3 1 99999999 3

输出结果

3

解法代码

#include <iostream>
#include <set>
using namespace std;int main() {int n;cin >> n;set<long long> uniqueNumbers;  // 使用long long防止溢出for(int i = 0; i < n; i++) {long long num;cin >> num;uniqueNumbers.insert(num);  // 自动去重}cout << uniqueNumbers.size() << endl;return 0;
}

六、set的进阶用法

1. 自定义排序规则

// 定义降序排列的set
struct Descending {bool operator()(int a, int b) const {return a > b;}
};set<int, Descending> descendingSet = {3, 1, 4, 2};// 输出: 4 3 2 1
for(int num : descendingSet) {cout << num << " ";
}

2. 存储自定义类型

struct Point {int x, y;// 必须定义比较运算符bool operator<(const Point& p) const {return (x == p.x) ? (y < p.y) : (x < p.x);}
};set<Point> pointSet;
pointSet.insert({1, 2});
pointSet.insert({3, 4});
pointSet.insert({1, 2});  // 重复元素,不会被插入cout << "点的数量: " << pointSet.size();  // 输出: 2

七、set的适用场景

适用场景

  1. 需要维护有序集合

  2. 需要频繁查询元素是否存在

  3. 需要自动去重的场景

  4. 需要按顺序遍历元素的场景


http://www.hkcw.cn/article/kUuMBZlhZL.shtml

相关文章

马克龙香会首秀倡“第三条道路” 吁欧亚共寻战略自主

第22届香格里拉对话会于5月30日在新加坡开幕,法国总统马克龙发表了主旨演讲。他呼吁亚洲各国与欧洲建立新联盟,通过开放贸易和对话以及在防务和安全方面加强合作,以打造一个稳定的环境并维护以规则为基础的国际秩序。北京外国语大学区域与全球治理高等研究院教授崔洪建表示,…

胖东来红内裤案当事人鞠躬道歉 名誉侵权案宣判

2025年5月28日,许昌市魏都区人民法院公开审理了原告许昌市胖东来商贸集团有限公司与被告段某的名誉权纠纷案,并当庭宣判。法院判决段某在其个人抖音账号“两个小段(小)”发布宣读书面道歉信的视频,书面道歉信需经法院审核,发布后30日内不得删除;段某赔偿许昌市胖东来商贸…

媒体人:特朗普在准备关税B计划 两步走应对法律挑战

美国总统特朗普提出的“对等关税”政策实施近两个月,但效果并不理想,还面临严峻的法律挑战。美国上诉法院暂时恢复了关税措施后,特朗普贸易团队正在为关税政策制定备用计划,以防止谈判因法律问题中断。《华尔街日报》5月30日援引消息人士的话称,特朗普团队正考虑一项两步走…

巴方为何突袭巴控克什米尔武装分子 挫败袭击基地企图

巴控克什米尔地区警方于5月29日表示,当地安全部队根据情报突袭了该地区一处武装分子藏身点,随后的枪战导致2名警察和4名巴基斯坦塔利班组织成员死亡。此次夜间突袭发生在拉沃拉果德县。当地警方负责人阿卜杜勒贾巴尔表示,被打死的武装分子隶属于巴基斯坦塔利班组织,并声称该…

端午其实是古人的卫生防疫日 解码香囊养生智慧

解码传统习俗健康密码,聚焦端午养生智慧。端午节历史悠久,蕴藏着中国最早的“卫生防疫”基因。这个节日不仅承载着丰富的文化内涵,还与现代公共卫生理念不谋而合。端午节是中国重要的传统节日,被称为“中国最早的卫生防疫日”。古代先民通过特定习俗与仪式,在仲夏时节主动…

上海独居老人3000万豪宅堆满垃圾 生活令人匪夷所思

中海建国里是上海的顶级豪宅,单价达到每平米23万元。一套160平米的房子总价超过3600万元。然而,有一位上海大妈住在价值3700万的豪宅里,却过着令人难以置信的生活。她喜欢捡垃圾,并且将这些垃圾堆在家里。时间久了,家里充满了苍蝇、蚊子、蟑螂,甚至有死老鼠。楼道里的垃圾…

媒体人:美用签证工具破坏教育交流 无理取闹损人不利己

近日,美国国务卿鲁比奥宣布将开始吊销中国学生签证,这一消息引起广泛关注。鲁比奥在社交媒体上表示,要吊销与中国政府有联系或在关键领域学习的中国学生签证。美国国务院网站也发布声明,称新签证政策优先考虑美国利益,并将与国土安全部合作推进吊销事宜,同时加强对中国学…

机器视觉运动控制一体机在背靠背点胶焊锡机上的应用

市场应用背景 点胶与焊锡作为制造业自动化关键环节&#xff0c;专注服务电子、半导体、汽车及医疗等领域的高精密工艺需求。精密高速点胶焊锡解决方案通过实现高精高效的流体控制与焊接操作&#xff0c;助力企业实现生产效率与产品品质的双重提升。 ▲ 待加工的PCB板 ▲ 点胶…

接口自动化测试实战:测试用例也能自动生成

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 作为测试&#xff0c;你可能会对以下场景感到似曾相识&#xff1a;开发改好的 BUG 反复横跳&#xff1b;版本兼容逻辑多&#xff0c;修复一个 BUG 触发了更多 BUG…

IO进程(进程间通信 IPC)

进程间通信方式IPC 1&#xff09;.早期的进程间通信: 无名管道&#xff08;pipe&#xff09;,有名管道&#xff08;fifo&#xff09;&#xff0c;信号(signal) 2&#xff09;.system V IPC: 共享内存&#xff08;share memory&#xff09;,消息队列&#xff08;message que…

端午时节,粽香四溢

端午时节&#xff0c;粽香四溢&#xff0c;那缕缕清香仿佛在召唤着我们共赴这一夏的热情之约。在这充满活力与希望的氛围里&#xff0c;codigger 作为分布式操作系统闪耀登场。它凭借高效协同的工作模式&#xff0c;让各个节点紧密配合、无缝衔接&#xff1b;以灵活拓展的架构&…

贪心算法实战3

文章目录 前言区间问题跳跃游戏跳跃游戏II用最少数量的箭引爆气球无重叠区间划分字母区间合并区间 最大子序和加油站监控二叉树 前言 今天继续带大家进行贪心算法的实战篇3&#xff0c;本章注意来解答一些运用贪心算法的比较难的问题&#xff0c;大家好好体会&#xff0c;怎么…

建筑水电燃气能耗管理系统

系统介绍 能耗管理系统使用物联网技术采集分布各地的电表、水表、燃气表等能源计量仪表数据&#xff0c;同时使用大数据技术对数据进行处理与存储。为满足用户对能源消耗的精细化管理&#xff0c;平台提供能耗看板、支路能耗统计、能耗同比/环比比较、能源流向图、能耗折标、单…

美国关税演了一出律政戏 特朗普政策遭法院叫停

最近国际贸易圈发生了一系列戏剧性的事件,特朗普的关税政策成为焦点。2025年4月2日,特朗普签署了一项“对等关税”行政令,宣布这一天为“解放日”。根据这项行政令,美国将对中国征收30%的关税,对墨西哥和加拿大的部分商品征收25%的关税,并对大多数进口商品征收10%的普遍关…

委内瑞拉宣布加入国际调解院 促进多极化与和平公正

5月30日,委内瑞拉外交部宣布正式加入国际调解院。公告中提到,由中国牵头成立的国际调解院是一个强有力的多边工具,其成立标志着国际秩序向多极化、多中心、和平公正方向发展的决定性转变。委内瑞拉祝贺并感谢中国政府为世界和平、国际正义及全球南方国家发展作出的历史性贡献…

Error: Flash Download failed - Could not load file “xxx.axf“

今天在Keil uVision5用ST-LINKV2仿真器下载程序到板卡上&#xff0c;报如下错误&#xff1a; 到上图提示的目录下&#xff0c;发现确实没有生成axf文件。解决方法如下&#xff1a; 按下图单击魔棒工具栏按钮&#xff1a; 在弹出的对话框中选择“C/C”&#xff0c;然后勾选“C9…

MES管理系统:Java+Vue,含源码与文档,实现生产过程实时监控、调度与优化,提升制造企业效能

前言&#xff1a; 在当今竞争激烈的制造业环境中&#xff0c;企业面临着提高生产效率、降低成本、提升产品质量以及快速响应市场变化等多重挑战。MES管理系统作为连接企业上层计划管理系统与底层工业控制之间的桥梁&#xff0c;扮演着至关重要的角色。它能够实时收集、分析和处…

IMU--编程

教程 IMU编程主要分两部分&#xff1a;下位机的控制器获取IMU数据发送给上位机&#xff0c;上位机获取IMU数据之后进行算法处理。 下位机编程 上位机编程 机器人中&#xff0c;上位机一般用ros实现&#xff0c;上位机接收到数据之后&#xff0c;需要进行哪些处理&#xff1f; …

袁弘张歆艺发文庆祝结婚九周年 幸福九年依旧甜蜜

5月30日晚,演员袁弘在社交平台发文庆祝结婚九周年,并祝愿天下有情人幸福长久。他还幽默地提到蛋糕上的四坨狗爪印,说狗狗太馋了。随后,张含韵转发并配文:这个蛋糕,九(周年)四(坨)甜。网友们纷纷留言祝福他们永远幸福下去。前一天,袁弘更新社交平台晒出张歆艺手捧鲜花…

微信朋友圈能折叠了 优化用户体验新举措

近日,有网友发现微信朋友圈新增了“折叠”功能。当好友发布多条信息时,这些信息可能会被折叠,在朋友圈信息下方显示“余下x条”,点击后可查看好友发布的其他消息。腾讯客服对此表示,如果用户频繁发送广告营销等内容,为了优化用户体验,这些信息会被折叠。用户点击该条朋友…