在 C++ 里,std::set属于标准库容器的一种,其特性是按照特定顺序存储唯一的元素。下面为你详细介绍它的常见使用方法:
 

1. 头文件引入

要使用std::set,需要在代码中包含相应的头文件:

#include <set>

 2. 集合的定义与初始化

// 定义一个存储int类型的空集合,默认按升序排列
std::set<int> s1;// 用初始化列表来初始化集合
std::set<int> s2 = {1, 2, 3};// 借助比较函数,定义一个按降序排列的集合
std::set<int, std::greater<int>> s3 = {3, 1, 2}; // 结果为3, 2, 1// 通过已有集合来初始化新集合
std::set<int> s4(s2);

 3. 元素的添加操作


   可以使用insert()方法向集合中添加元素:

std::set<int> s;
s.insert(10); // 集合现在包含元素10
s.insert(20); // 集合现在包含元素10和20
s.insert(10); // 由于元素10已存在,不会重复添加

4. 元素的查找操作

若要查找集合中是否存在某个元素,可使用find()count()方法:

auto it = s.find(20); // 如果找到元素20,it指向该元素;否则it等于s.end()
if (it != s.end()) {std::cout << "找到了元素:" << *it << std::endl;
}bool exists = s.count(20); // 若元素20存在,返回1;否则返回0

5. 元素的删除操作

可以使用erase()方法删除集合中的元素:

s.erase(20); // 删除元素20
s.erase(s.find(10)); // 通过迭代器删除元素10
s.clear(); // 清空集合中的所有元素

6. 集合的遍历操作

集合支持使用迭代器、范围 for 循环或者 C++20 引入的范围库来遍历元素:

// 使用迭代器遍历
for (auto it = s.begin(); it != s.end(); ++it) {std::cout << *it << " ";
}// 使用范围for循环遍历
for (const auto& element : s) {std::cout << element << " ";
}// 使用C++20的范围库(需要包含<ranges>头文件)
for (auto element : s | std::views::reverse) {std::cout << element << " "; // 逆序输出元素
}

7. 集合的大小与判空

可以通过以下方法了解集合的大小以及判断集合是否为空:

size_t size = s.size(); // 获取集合中元素的数量
bool empty = s.empty(); // 判断集合是否为空

8. 其他实用方法

集合还提供了一些其他有用的方法:

auto lower = s.lower_bound(15); // 返回第一个大于或等于15的元素的迭代器
auto upper = s.upper_bound(15); // 返回第一个大于15的元素的迭代器// 交换两个集合的内容
std::set<int> s5 = {4, 5};
s.swap(s5);

9. 自定义比较函数

对于自定义类型,需要定义比较函数:

struct Person {std::string name;int age;
};// 按照age升序排列
struct Compare {bool operator()(const Person& p1, const Person& p2) const {return p1.age < p2.age;}
};std::set<Person, Compare> people = {{"Alice", 25}, {"Bob", 20}};

10. 多重集合(允许重复元素)

如果需要存储重复元素,可以使用std::multiset

std::multiset<int> ms;
ms.insert(10);
ms.insert(10); // 允许插入重复的10

典型应用场景

  • 自动对元素进行排序。
  • 高效地去重(时间复杂度为 O (log n))。
  • 快速查找、插入和删除元素(时间复杂度均为 O (log n))。

注意要点

  • 集合中的元素是不可变的,若要修改元素,需先删除该元素,再插入新元素。
  • 集合会自动对元素进行排序,因此插入顺序不会被保留。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/910294.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/910294.shtml
英文地址,请注明出处:http://en.pswp.cn/news/910294.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

stm32移植freemodbus

1、设置串口 开启串口中断 2、设置定时器 已知在freemodbus中默认定义&#xff1a;当波特率大于19200时&#xff0c;判断一帧数据超时时间固定为1750us&#xff0c;当波特率小于19200时&#xff0c;超时时间为3.5个字符时间。这里移植的是115200&#xff0c;所以一帧数据超时…

鸿蒙next 使用canvas实现ecg动态波形绘制

该代码可在Arkts 与 前端使用&#xff0c;基于canvas 仓库地址&#xff1a;https://gitee.com/harmony_os_example/harmony-os-ecg-waveform.git 代码中的list数组为波形数据&#xff0c;该示例需要根据自己业务替换绘制频率&#xff0c;波形数据&#xff0c;ecg原始数据生成…

基于原生能力的键盘控制

基于原生能力的键盘控制 前言一、进入页面TextInput获焦1、方案2、核心代码 二、点击按钮或其他事件触发TextInput获焦1、方案2、核心代码 三、键盘弹出后只上抬特定的输入组件1、方案2、核心代码 四、监听键盘高度1、方案2、核心代码 五、设置窗口在键盘抬起时的页面避让模式为…

大数据治理域——数据存储与成本管理

摘要 本文主要探讨了数据存储与成本管理的多种策略。介绍了数据压缩技术&#xff0c;如MaxCompute的archive压缩方法&#xff0c;通过RAID file形式存储数据&#xff0c;可有效节省空间&#xff0c;但恢复时间较长&#xff0c;适用于冷备与日志数据。还详细阐述了数据生命周期…

国产Linux银河麒麟操作系统上使用自带openssh远程工具SSH方式登陆华为交换机或服务器

在Windows和Linux Debian系统上我一直使用electerm远程工具访问服务器或交换机&#xff0c; 一、 electerm简介 简介&#xff1a;electerm是一款开源免费的SSH工具&#xff0c;具有良好的跨平台兼容性&#xff0c;适用于Windows、macOS、Linux以及麒麟操作系统。特点&#xf…

Logback 在java中的使用

Logback 是 Java 应用中广泛使用的日志框架&#xff0c;以下是其核心使用方法及最佳实践&#xff1a; 1. 引入依赖 在 Maven 或 Gradle 项目中添加 Logback 及 SLF4J 依赖&#xff1a; <!-- Maven --> <dependency><groupId>ch.qos.logback</groupId>…

Axure应用交互设计:中继器—整行、条件行、当前行赋值

亲爱的小伙伴,如有帮助请订阅专栏!跟着老师每课一练,系统学习Axure交互设计课程! Axure产品经理精品视频课https://edu.csdn.net/course/detail/40420 课程主题:对中继器中:整行、符合某种条件的任意行、当前行的赋值操作 课程视频:

ToolsSet之:TTS及Morse编解码

ToolsSet是微软商店中的一款包含数十种实用工具数百种细分功能的工具集合应用&#xff0c;应用基本功能介绍可以查看以下文章&#xff1a; Windows应用ToolsSet介绍https://blog.csdn.net/BinField/article/details/145898264其中Text菜单中的TTS & Morse可用于将文本转换…

【C++】编码传输:创建零拷贝帧对象4:shared_ptr转unique_ptr给到rtp打包

【C++】编码传输:创建零拷贝帧对象3: dll api转换内部的共享内存根本原因 你想要的是基于 packet 指向的那个已有对象,拷贝(或移动)出一个新的 VideoDataPacket3 实例,因此需要把那个对象本身传进去——也就是 *packet。copilot的原因分析与gpt一致 The issue is with t…

基于UDP的套接字通信

udp是一个面向无连接的&#xff0c;不安全的&#xff0c;报式传输层协议&#xff0c;udp的通信过程默认也是阻塞的。使用UDP进行通信&#xff0c;服务器和客户端的处理步骤比TCP要简单很多&#xff0c;并且两端是对等的 &#xff08;通信的处理流程几乎是一样的&#xff09;&am…

华为CE交换机抓包

capture-packet interface 100GE1/0/5 destination file 001.cap packet-len 64 注&#xff1a;早期版本&#xff08;disp device&#xff09;可能在系统视图下&#xff08;sys&#xff09; 抓完包后可以看到对应文件&#xff08;早期版本在根目录下&#xff09;&#xff1a;…

Python 数据分析与可视化 Day 3 - Pandas 数据筛选与排序操作

&#x1f3af; 今日目标 掌握 DataFrame 的条件筛选&#xff08;布尔索引&#xff09;学会多条件筛选、逻辑运算熟练使用排序&#xff08;sort_values&#xff09;提升数据组织力结合列选择进行数据提取分析 &#x1f9ea; 一、列选择与基本筛选 ✅ 选择单列 / 多列 df[&quo…

Vite项目初始化与配置

下面,我们来系统的梳理关于 Vite 项目初始化与配置 的基本知识点: 一、Vite 核心概念与优势 1.1 什么是 Vite? Vite(法语意为 “快速”)是新一代的前端构建工具,由 Vue.js 作者尤雨溪开发。它解决了传统构建工具(如 Webpack)在开发环境中的性能瓶颈问题。 1.2 Vite …

Transformer中的核心问题 知识点汇总

Transformer架构图 transformer整体架构 1. Transformer 的参数配置 Transformer 的Encoder层和Decoder层都使用6个注意力模块&#xff0c;所有的子网络的输出维度均为512维&#xff0c;多头注意力部分使用了8个注意力头。 2. 归一化的方式 归一化的方式为LayerNorm&#xff0c…

python web开发-Flask数据库集成

Flask 数据库集成完全指南&#xff1a;Flask-SQLAlchemy 实践 1. 引言 数据库是现代Web应用的核心组件&#xff0c;Flask通过Flask-SQLAlchemy扩展提供了强大的数据库集成能力。本文将全面介绍如何在Flask应用中使用Flask-SQLAlchemy进行数据库操作&#xff0c;涵盖从基础配置…

一站式用AI编程神奇Cursor/Trae(VScode环境)开发运行Scala应用

平时开发时&#xff0c;我们常用 IDEA 搭配 Scala 来开发 Spark 或 Flink 等大数据应用。但如今像 Cursor 这样的编程神器层出不穷&#xff0c;它们只支持 VSCode。要是 Scala 应用能在 VSCode 环境下便捷运行&#xff0c;我们就无需在 VSCode 开发、却在 IDEA 运行&#xff0c…

【Django开发】django美多商城项目完整开发4.0第2篇:项目准备,配置【附代码文档】

教程总体简介&#xff1a;美多商城 商业模式介绍 1.B2B--企业对企业 2.C2C--个人对个人 5.O2O--线上到线下 开发流程 说明&#xff1a; 需求分析 1. 用户部分 注册 登录 个人信息 地址管理 修改密码 3. 购物车部分 购物车管理 项目架构 创建工程 1. 在git平台创建工程 2. 添加前…

基于 OpenCV 的图像亮度、对比度与锐度调节

图像亮度、对比度和锐度是图像质量感知的重要参数&#xff0c;调节这些属性常用于图像增强、图像美化或图像分析的预处理阶段。本文将基于 OpenCV 实现这三项基础图像处理功能&#xff0c;并提供滑动条交互界面与直方图可视化分析&#xff0c;方便调试和理解效果。 亮度调整 图…

WAF(web应用防火墙)的简单了解

WAF称之为Web应用防火墙&#xff0c;是一种专门设计用于保护web应用程序免受恶意攻击的安全设备&#xff0c;能实时监控过滤和拦截可能对网站造成危害的网络流量&#xff0c;从而避免网络服务器被恶意入侵导致性能异常、数据泄露、服务中断这些问题 (WAF是通过执行一系列针对HT…

跟着AI学习C# Day28

&#x1f4c5; Day 28&#xff1a;C# 源生成器&#xff08;Source Generators&#xff09;与编译时元编程 ✅ 学习目标&#xff1a; 理解什么是 源生成器&#xff08;Source Generator&#xff09;&#xff1b;掌握如何在 编译阶段生成 C# 代码&#xff0c;而不是运行时动态处…