11、STL中的set使用方法
一、了解
set 是 C++ 标准模板库(STL)中提供的有序关联容器之一。基于红黑树(Red-Black Tree)实现,用于存储一组唯一的元素,并按照元素的值进行排序。
- set的特性
- 唯一性
- 键是唯一的。无重复。
- 有序性
- 按升序排列,因为红黑树的平衡性质。可以自定义排序规则。
- 插入元素
- 如果元素已存在,就不会进行了。
- 不可修改键值
- 键值都是const的。如果要修改,先删除要修改的元素,再插入要修改后的值。
- 唯一性
常见问题
1、如何检查 std::set 中是否存在某个值?
- 使用
find,知道,返回值的迭代器,否则返回end()
if (mySet.find(key) != mySet.end()){函数体}可以用来遍历2、set的迭代器是什么类型
双向迭代器。不能随机访问,可以向把迭代器进行后-- 或向前++。3、set的迭代器失效?
- set主要
与删除有关,被删除的元素的迭代器会失效。但是,由于红黑树的性质,删除操作不会影响到其他元素的迭代器,所以除了被删除元素的迭代器外,其他迭代器仍然有效。
- set的头文件
#include<set>
二、初始化
set<typename>name
set<typename,自定义排序规则>name
- 例子
std::set<int> s1; // 默认升序:{1, 2, 3}
std::set<int, std::greater<int>> s2; // 降序:{3, 2, 1}
- 自定义排序
struct Person {std::string name;int age;
};// 定义比较仿函数(按年龄升序)
struct CompareAge {bool operator()(const Person& a, const Person& b) const {return a.age < b.age;}
};std::set<Person, CompareAge> peopleSet;
peopleSet.insert({"Alice", 25});
peopleSet.insert({"Bob", 30});
三、常用函数
1、总结

2、例子
- 首先是这里用到的头文件
#include <iostream>
#include<set>
using namespace std;
2.1、插入操作
- insert(x)
- 插入某一个常数或变量
int main(){set<int>set1={1,2,3,4};set1.insert(3);for(auto i: set1){cout<<i<<" "<<endl;}
/*
1
2
3
4 */
}
- insert( other_set_first, other_set_end)
- 插入另一个set的范围
int main(){set<int>set1={1,2,3,4};set<int>set2={7,6,5};set1.insert(set2.begin(),set2.end());for(auto i: set1){cout<<i<<" ";}
/*
1 2 3 4 5 6 7*/
}
- insert(pos , x)
- 在当前set的pos处,插入x
int main(){set<int>set1={1,2,3,4};set<int>set2={7,6,5};set1.insert(set1.begin(),2);for(auto i: set1){cout<<i<<" ";}
/*
1 2 3 4*/
}
2.2、删除操作
- erase(pos)
- 删除某一个迭代器位置
int main(){set<int>set1={1,2,3,4};set1.erase(set1.begin());for(auto i: set1){cout<<i<<" ";}
/*
2 3 4*/
}
- erase(key)
- 删除特定键值
int main(){set<int>set1={1,2,3,4};set1.erase(2);for(auto i: set1){cout<<i<<" ";}
/*
1 3 4*/
}
- erase(first , end)
- 删除当前set的范围
int main(){set<int>set1={1,2,3,4};set1.erase(set1.begin(),++set1.begin());for(auto i: set1){cout<<i<<" ";}
/*
2 3 4*/
}
2.3、访问操作
- 迭代器访问
- begin:指向set第一个位置的指针
- end:指向最后一个元素之后的位置
int main(){set<int>set1={1,2,3,4};auto i =set1.begin();set<int>::iterator it=set1.end();cout<<*i<<endl;//1cout<<*it<<endl;//4
}
2.4、交换操作
- swap(other_set)
- 交换2个set
int main(){set<int>set1={1,2,3,4};set<int>set2={3,4};set1.swap(set2);for(auto i: set1){cout<<i<<" ";//3 4}}
2.5、查找操作
- count(key)
- 返回key值的个数
int main(){set<int>set1={1,2,3,4};auto i =set1.count(1);cout<<i<<endl;//1}
- find(key)
- 返回key位置的迭代器
int main(){set<int>set1={1,2,3,4};auto i =set1.find(1);cout<<*i<<endl;//1}
2.6、容量操作
- size()
- 返回元素个数
int main(){set<int>set1={1,2,3,4};auto i =set1.size();cout<<i<<endl;//4}
- empty()
- 检查容器是否为空
int main(){set<int>set1={1,2,3,4};if(set1.empty()==0){cout<<"set1有元素"<<endl;//set1有元素}else{cout<<"无元素"<<endl;}
}
2.7、清空操作
- clear
- 清空所有元素
int main(){set<int>set1={1,2,3,4};set1.clear();for(auto i: set1){cout<<i<<" ";}}
2.8、lower_bound和upper_bound
- lower_bound(key)
- 返回第一个不小于(>=) key 的迭代器
int main(){set<int>set1={1,2,3,4};auto i = set1.lower_bound(2);cout<<*i<<endl;//2
}
- upper_bound(key)
- 返回第一个大于 key 的迭代器
int main(){set<int>set1={1,2,3,4};auto i = set1.upper_bound(2);cout<<*i<<endl;//3
}
四、set和map的区别
- 存储内存
- set只存储键值
- map存储键值对
- 唯一性
- set的键是唯一的,无重复
- map键值对,键也是唯一的,但是值可以重复。
- 访问方式
- set通过迭代器遍历或查找键find(key),并且不能修改键值。
- map通过键直接访问值(m[key] 或 m.at(key))
相关文章:
11、STL中的set使用方法
一、了解 set 是 C 标准模板库(STL)中提供的有序关联容器之一。基于红黑树(Red-Black Tree)实现,用于存储一组唯一的元素,并按照元素的值进行排序。 set的特性 唯一性 键是唯一的。无重复。 有序性 按升序…...
git 子模块的使用
1. 子模块的核心概念 独立性:子模块是一个独立的 Git 仓库,有自己的提交历史和分支。 指针机制:主仓库仅记录子模块的特定提交(而不是分支),确保代码版本可控。 适用场景:依赖第三方库、多项目…...
vsftpd服务权限配置
主配置文件:/etc/vsftpd/vsftpd.conf anonymous_enableYES #是否启用匿名用户 no_anon_passwordYES #匿名用户login时不询问口令 anon_upload_enableyes | no # 匿名用户对文件(非目录)上传权限。 anon_world_readable_onlyyes | …...
遥感数据获取、处理、分析到模型搭建全流程学习!DeepSeek、Python、OpenCV驱动空天地遥感数据分析
【扔进数据,直接出结果】在科技飞速发展的时代,遥感数据的精准分析已经成为推动各行业智能决策的关键工具。从无人机监测农田到卫星数据支持气候研究,空天地遥感数据正以前所未有的方式为科研和商业带来深刻变革。然而,对于许多专…...
操作系统——(管程、线程、进程通信)
目录 一、管程机制 (1)管程定义 (2)特点: 二、进程通信 (1)概念 (2)高级通信机制 三、线程 (1)概念 (2)与进程比较…...
Sqlserver安全篇之_启用和禁用Named Pipes的案列介绍
https://learn.microsoft.com/zh-cn/sql/tools/configuration-manager/named-pipes-properties?viewsql-server-ver16 https://learn.microsoft.com/zh-cn/sql/tools/configuration-manager/client-protocols-named-pipes-properties-protocol-tab?viewsql-server-ver16 默认…...
Redis 本地安装
首先安装: https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis/install-redis-from-source/ 进入root目录 tar -xzvf redis-stable.tar.gz cd redis-stable make然后 install sudo make install最后可以直接启动 redis-server但是此时启…...
外卖订单如何教会我变量与数据类型?
目录 前言一、现实场景1.1 你点的每一碗,都是程序员的KPI1.2 关键数据角色扮演 二、技术映射三、知识点呈现3.1 变量——你的数字日记本3.2 数据类型——数值的「职业规划」3.3 运算符——数学老师的黑板擦 四、代码实现4.1 基础版:计算器の复仇4.2 进阶…...
HOW - 平时如何保持学习和成长?
目录 前言数字时代的系统性学习方法论一、场景驱动的实战学习:从工具赋能到知识沉淀二、结构化的系统学习:构建知识体系的方法论(一)精准学习策略(二)学习成效评估体系(三)专项研究 …...
Web开发-JS应用原生代码前端数据加密CryptoJS库jsencrypt库代码混淆
知识点: 1、安全开发-原生JS-数据加密&代码混淆 2、安全开发-原生JS-数据解密安全案例 一、演示案例-WEB开发-原生JS&第三方库-数据加密 前端技术JS实现: 1、非加密数据大致流程: 客户端发送->明文数据传输-服务端接受数据->…...
手动集成sqlite的方法
注意到sqlite有backup方法(https://www.sqlite.org/backup.html)。 也注意到android中sysroot下,没有sqlite3的库,也没有相关头文件。 如果要使用 sqlite 的backup,那么就需要手动集成sqlite代码到项目中。可以如下操…...
比特币牛市还在不在
在加密货币的风云世界里,比特币的一举一动始终牵动着投资者们的神经。近期比特币的涨幅动作,再次引发了市场对于牛市是否仍在延续的激烈讨论。 在深入探索比特币市场的过程中,获取全面且及时的资讯至关重要。您可以通过访问Techub News&#…...
Python、MATLAB和PPT完成数学建模竞赛中的地图绘制
参加数学建模比赛时,很多题目——诸如统计类、数据挖掘类、环保类、建议类的题目总会涉及到地理相关的情景,往往要求我们制作与地图相关的可视化内容。如下图,这是21年亚太赛的那道塞罕坝的题目,期间涉及到温度、降水和森林覆盖率…...
跨平台RTSP高性能实时播放器实现思路
跨平台RTSP高性能实时播放器实现思路 目标:局域网100ms以内超低延迟 一、引言 现有播放器(如VLC)在RTSP实时播放场景中面临高延迟(通常数秒)和资源占用大的问题。本文提出一种跨平台解决方案,通过网络层…...
编写一个简单的chrome截图扩展
文件结构: screenshot |-- background.js ---> service_worker运行的js |-- images ---> 图片 | |-- logo-128x128.png | |-- logo-16x16.png | |-- logo-32x32.png | -- logo-48x48.png -- manifest.json --->…...
吴恩达机器学习笔记复盘(六)梯度下降算法
简介 梯度下降(Gradient Descent)是一种常用的优化算法,广泛应用于机器学习、深度学习等领域,在这里是用于求J(w,b)局部最小值。 我自己觉得这样说有点过于抽象。换个直观点的说法就是,一个人…...
【机器学习chp14 — 3】生成式模型—生成对抗网络GAN(超详细分析,易于理解,推导严谨,一文就够了)
目录 三、生成对抗网络 ( Generative Adversarial Networks,GAN ) 1、GAN的基本思想 (1)生成器与判别器的基本结构与演变 (2)“对抗”机制及名词由来 2、GAN训练的基本算法 (1)网络初始化与…...
机器人打磨控制技术
工具姿态调整运动 法线方向对齐运动:机器人实时调整工具姿态,使打磨工具的轴线与工件曲面的法线方向一致。例如,在球面打磨时,工具需始终垂直于球面切线。角度补偿运动:针对倾斜或不规则曲面,通过调整机器人…...
K8S学习之基础四十:K8S配置altermanager发送告警到钉钉群
配置altermanager发送告警到钉钉群 创建钉钉群,设置机器人助手(必须是管理员才能设置),获取webhook webhook: https://oapi.dingtalk.com/robot/send?access_token25bed933a52d69f192347b5be4b2193bc0b257a6d9ae68d81619e3ae3d93f7c6…...
Spring Boot + Spring Integration整合MQTT打造双向通信客户端
1. 概述 本文分两个章节讲解MQTT相关的知识,第一部份主要讲解MQTT的原理和相关配置,第二个章节主要讲和Spring boot的integration相结合代码的具体实现,如果想快速实现功能,可直接跳过第一章节查看第二章讲。 1.1 MQTT搭建 为了…...
Sampling – Model Context Protocol Specification
网页链接 https://spec.modelcontextprotocol.io/specification/draft/client/sampling/ 主要内容概述 该网页详细介绍了Model Context Protocol (MCP) 中的“Sampling”功能。Sampling允许服务器通过客户端请求语言模型(LLM)生成文本、音频或图像内容…...
Java 填充 PDF 模版
制作 PDF 模版 安装 OnlyOffice 从 OnlyOffice 官网下载 OnlyOffice Desktop,安装过程很简单,一路下一步即可。用 OnlyOffice 制作 PDF 模版(表单) 使用 OnlyOffice 表单设计器,制作表单,如下图 注意命名…...
前端项目中应该如何选择正确的图片格式
在前端项目中选择正确的图片格式是优化页面性能、提升用户体验的关键步骤之一。以下是常见图片格式的特点、适用场景及选择建议,帮助你在不同场景下做出最优决策: 一、常见图片格式对比 格式特点适用场景不适用场景JPEG- 有损压缩,文件小- 不…...
Vulnhub-dedecms织梦通关攻略
姿势一、通过文件管理器上传WebShell 第一步:进入后台,找到文件管理器上传木马文件 第二步:使用蚁剑进行连接 #文件地址 http://localhost/dedecms/shell.php 姿势二、修改模板⽂件拿WebShell 第一步:修改模板文件,删除…...
数据集获取
sklearn数据集 sklearn有四部分数据。其中sklearn的数据集有两部分真实的数据,一部分嵌入到了sklearn库中,即安装好sklearn后就自带了一部分数据,这些数据的规模比较小称为small toy datasets ,还有一部分数据是需要在网上下载的,sklearn提供了下载的api接口,这些数据规…...
实验12深度学习
实验12深度学习 一、实验目的 (1)理解并熟悉深度神经网络的工作原理; (2)熟悉常用的深度神经网络模型及其应用环境; (3)掌握Anaconda的安装和设置方法,进一步熟悉Jupyte…...
2024年消费者权益数据分析
📅 2024年315消费者权益数据分析 数据见:https://mp.weixin.qq.com/s/eV5GoionxhGpw7PunhOVnQ 一、引言 在数字化时代,消费者维权数据对于市场监管、商家诚信和行业发展具有重要价值。本文基于 2024年315平台线上投诉数据,采用数…...
零知识证明:区块链隐私保护的变革力量
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…...
rag-给一篇几百页的pdf,如何从中找到关键信息并汇总出关系图
小思考 对pdf肯定要做模糊chunk,能用模型切分就用模型切分,不能用模型就用规则,规则要尽可能保存连续文本,特殊数据格式(图、表格)必须完整保存,必须能被捕捉到。这些独立的表格or图数据&#…...
Rust语言学习
Rust语言学习 通用编程概念所有权所有权引用和借用slice struct(结构体)定义并实例化一个结构体使用结构体方法语法 枚举 enums定义枚举match控制流运算符if let 简单控制流 使用包、Crate和模块管理不断增长的项目(模块系统)包和crate定义模块来控制作用…...
