「C/C++」C++ STL容器库 之 std::set 唯一键的集合容器

news2024/10/24 10:44:54

在这里插入图片描述

✨博客主页
何曾参静谧的博客
📌文章专栏
「C/C++」C/C++程序设计
📚全部专栏
「VS」Visual Studio「C/C++」C/C++程序设计「UG/NX」BlockUI集合
「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发
「QT」QT5程序设计「File」数据文件格式「PK」Parasolid函数说明

目录

      • std::set容器深度解析
        • 1. 引用头文件
        • 2. 注意事项
        • 3. 函数构造与对象初始化
        • 4. 元素访问
        • 5. 迭代器
        • 6. 容器修改器
        • 7. 元素比较
        • 总结与应用场景

std::set容器深度解析

1. 引用头文件

在C++标准模板库(STL)中,std::set是一个重要的关联容器,它提供了自动排序且元素唯一的存储机制。要使用std::set,首先需要包含其对应的头文件:

#include <set>
2. 注意事项
  • 元素唯一性std::set中的元素是唯一的,不允许重复。
  • 自动排序:元素会根据提供的比较函数(默认为<运算符)进行排序。
  • 不支持随机访问:由于底层实现为红黑树,std::set不支持通过下标访问元素。
  • 内存开销:红黑树的实现导致std::set的内存开销相对较大。
3. 函数构造与对象初始化

std::set提供了多种构造函数来初始化对象:

  • 默认构造函数:创建一个空的set容器。
  • 拷贝构造函数:用另一个set容器来初始化新的set容器。
  • 赋值构造函数:通过赋值运算符从一个set容器创建另一个set容器。
  • 初始化列表构造函数:使用初始化列表来初始化set容器。
  • 迭代器范围构造函数:使用两个迭代器(指向容器或其他序列的起始和结束位置)来初始化set容器。

示例代码:

#include <set>
#include <iostream>

int main() {
    // 默认构造函数
    std::set<int> s1;

    // 初始化列表构造函数
    std::set<int> s2 = {5, 3, 8, 1, 9, 9}; // 这里的9不会重复出现
   
    // 拷贝构造函数
    std::set<int> s3(s2);

    // 迭代器范围构造函数(假设有一个数组)
    int arr[] = {2, 4, 6, 7, 0};
    std::set<int> s4(arr, arr + 5);

    // 输出set元素(自动排序)
    for (const auto& elem : s4) {
        std::cout << elem << " ";
    }
    std::cout << std::endl;

    return 0;
}
4. 元素访问

在这里插入图片描述

由于std::set不支持随机访问,因此不能通过下标访问元素。但可以使用成员函数如findcountlower_boundupper_bound来查找元素。

示例代码:

#include <set>
#include <iostream>

int main() {
    std::set<int> s = {1, 2, 3, 4, 5};

    // 使用find查找元素
    auto it = s.find(3);
    if (it != s.end()) {
        std::cout << "Found 3 in the set." << std::endl;
    } else {
        std::cout << "3 not found in the set." << std::endl;
    }

    // 使用count检查元素是否存在(对于set,count要么为0要么为1)
    if (s.count(6) == 0) {
        std::cout << "6 not found in the set." << std::endl;
    }

    return 0;
}
5. 迭代器

在这里插入图片描述

std::set的迭代器是双向迭代器,支持向前和向后遍历容器中的元素。由于std::set的迭代器与底层红黑树结构相关联,因此在插入和删除操作时(除了被删除的迭代器外),其余迭代器仍然有效。

#include <iostream>  
#include <set>  
  
int main() {  
    std::set<int> mySet = {1, 2, 3, 4, 5};  
  
    // 使用范围for循环遍历set  
    for (const int& elem : mySet) {  
        std::cout << elem << " ";  
    }  
    std::cout << std::endl;  
  
    // 使用迭代器遍历set  
    for (std::set<int>::iterator it = mySet.begin(); it != mySet.end(); ++it) {  
        std::cout << *it << " ";  
    }  
    std::cout << std::endl;  
    
    // 迭代器遍历并删除对象
    for (auto it = mySet.begin(); it != mySet.end();) {  
		if (*it % 2 == 0) { // 删除所有偶数元素作为示例  
			it = mySet.erase(it); // erase返回指向下一个元素的迭代器  
		} else {  
			std::cout << *it  << " ";  
			++it; // 只有当没有删除元素时才递增迭代器  
		}  
	}
	std::cout << std::endl;  
    return 0;  
}
6. 容器修改器

在这里插入图片描述

std::set提供了多种成员函数来修改容器:

  • insert:插入元素(如果元素已存在,则插入失败)。
  • erase:删除元素。
  • clear:清除所有元素。
  • swap:交换两个set容器的元素。
#include <set>
#include <iostream>

int main() {
    std::set<int> s = {1, 2, 3, 4, 5};

    // 插入元素
    auto result = s.insert(6);
    if (result.second) {
        std::cout << "Inserted 6 successfully." << std::endl;
    } else {
        std::cout << "6 already exists in the set." << std::endl;
    }

    // 删除元素
    s.erase(3);

    // 输出修改后的set元素
    for (const auto& elem : s) {
        std::cout << elem << " ";
    }
    std::cout << std::endl;
    
    // 清除所有元素
    s.clear();

    return 0;
}
7. 元素比较

在这里插入图片描述

std::set中的元素是根据提供的比较函数(默认为<运算符)进行排序的。因此,可以直接使用比较运算符来比较std::set中的元素或迭代器指向的元素。

总结与应用场景

std::set是一个功能强大的关联容器,它提供了自动排序和元素唯一的特性。然而,由于红黑树的实现,其内存开销相对较大,且不支持随机访问。std::set适用于需要快速查找、插入和删除唯一元素的场景,如:

  • 去重和排序:将一组数据去重并排序。
  • 元素查找:在大量数据中快速查找某个元素是否存在。
  • 集合运算:如并集、交集、差集等集合运算(可以使用STL中的算法如std::set_unionstd::set_intersectionstd::set_difference等)。
  • 需要保持元素有序性的场景:如任务调度、资源管理等。

通过合理使用std::set容器,可以显著提高程序的效率和可靠性,特别是在需要处理唯一性和排序性的场景中。


在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

小鹏汽车股价分析:看涨信号已出现,技术指标显示还有40%的上涨空间

猛兽财经核心观点&#xff1a; &#xff08;1&#xff09;小鹏汽车的股价过去几天有所回落。 &#xff08;2&#xff09;随着需求的上升&#xff0c;该公司的业务发展的还算不错。 &#xff08;3&#xff09;猛兽财经对小鹏汽车股价的技术分析&#xff1a;多头已经将目标指向15…

【通俗理解】Neurosymbolic AI——融合神经网络与符号推理的智慧之力

【通俗理解】Neurosymbolic AI——融合神经网络与符号推理的智慧之力 关键词提炼 #Neurosymbolic AI #神经网络 #符号推理 #感知能力 #逻辑能力 #认知水平 #智慧与力量 第一节&#xff1a;Neurosymbolic AI的类比与核心概念 Neurosymbolic AI就像是给神经网络这位“大力士”…

排序算法 —— 计数排序

目录 1.计数排序的思想 2.计数排序的实现 3.计数排序的分析 时间复杂度 空间复杂度 稳定性 优点 缺点 1.计数排序的思想 顾名思义&#xff0c;计数排序就是通过计数的方式来排序&#xff0c;其基本思想为&#xff1a; 开辟一个计数数组&#xff0c;统计每个数出现的次…

计算机毕业设计Hadoop+大模型在线教育大数据分析可视化 学情分析 课程推荐系统 机器学习 深度学习 人工智能 大数据毕业设计

一、研究背景和意义 “互联网”和大数据带来了网络教育的蓬勃发展&#xff0c;学习分析技术和自适应学习也在近年内得到了重大突破。在线教育是互联网技术与传统教育的结合&#xff0c;是当前中国教育信息化发展最快的领域&#xff0c;而当下最迫切的是有效整合教育资源和互联…

AJAX——使用 fetch 发送 AJAX 请求

1、fetch&#xff08;&#xff09;函数属于全局函数&#xff0c;可以全局调用&#xff0c;返回的结果是一个 promise 对象。 2、语法&#xff1a; 3、参数 本文分享到此结束&#xff0c;欢迎大家评论区相互讨论学习&#xff0c;下一篇继续分享AJAX中同源策略的学习。

ChatGPT实现旅游推荐微信小程序

随着旅游行业的快速发展&#xff0c;个性化推荐已成为提升用户体验的重要手段。通过AI技术&#xff0c;提供一个智能旅游推荐小程序&#xff0c;使用户能够轻松获取定制化的旅行建议。 项目概述 项目目标 开发一个AI旅游推荐小程序&#xff0c;基于用户输入的旅行偏好&#…

Axure中继器单选、多选和重置

亲爱的小伙伴&#xff0c;在您浏览之前&#xff0c;烦请关注一下&#xff0c;在此深表感谢&#xff01; 课程主题&#xff1a;Axure中继器单选、多选和重置 主要内容&#xff1a;根据查询条件&#xff0c;通过单选、多选和重置&#xff0c;从中继器中得到数据 应用场景&…

C++ 二叉树进阶:二叉搜索树

目录 二叉搜索树的概念 二叉搜索树的实现 基本结构 插入 1&#xff0c;当树是空树的时候 2&#xff0c;当树不为空的时候 3&#xff0c;纠正后的代码 查找 删除 1&#xff0c;左为空或右为空 2&#xff0c;左右都不为空 3&#xff0c;删除的完整代码&#xff1a; 二…

hadoop-Zookeeper安装

hadoop-Zookeeper安装 Ububtu18.04安装Zookeeper3.7.1 环境与版本 这里采用的ubuntu18.04环境的基本配置为&#xff1a; hostname 为master 用户名为hadoop 静态IP为 192.168.100.3 网关为 192.168.100.2 防火墙已经关闭 /etc/hosts已经配置全版本下载地址&#xff1a; htt…

Director3D: Real-world Camera Trajectory and 3DScene Generation from Text 论文解读

目录 一、概述 二、相关工作 1、文本到3D生成 2、3DGS 三、Director3D 1、Cinematographer 2、Decorator 3、Detailer 4、Loss 一、概述 该论文提出利用真实世界数据集&#xff0c;设计一个从文本生成真实世界3D场景和自适应相机轨迹的强大的开放世界文本到3D生成框架…

Git使用GUI界面实现任意历史版本对比

首先进入版本历史查看界面 标记某次提交 选择某次提交并和标记的提交对比 可以查看比较结果了&#xff0c;具体到每一个文件每一行代码

鸿蒙HarmonyOS NEXT 5.0开发(2)—— ArkUI布局组件

文章目录 布局Column&#xff1a;从上往下的布局Row&#xff1a;从左往右的布局Stack&#xff1a;堆叠布局Flex&#xff1a;自动换行或列 组件Swiper各种选择组件 华为官方教程B站视频教程 布局 主轴和交叉轴的概念&#xff1a; 对于Column布局而言&#xff0c;主轴是垂直方…

cnn做整图匹配

好像还没有人把cnn在工业机器视觉中使用&#xff0c;我们打破界限&#xff0c;试一试&#xff01; 工业上有很多需求&#xff0c;判断加工产品有还是没有&#xff0c;从前基本上都是使用找斑的方法来判断。 我们可以用cnn代替试试&#xff01; 我们前头cnn最好成绩是&#x…

STM32(二十一):看门狗

WDG&#xff08;Watchdog&#xff09;看门狗&#xff0c;手动重装寄存器的操作就是喂狗。 看门狗可以监控程序的运行状态&#xff0c;当程序因为设计漏洞、硬件故障、电磁干扰等原因&#xff0c;出现卡死或跑飞现象时&#xff0c;看门狗能及时复位程序&#xff0c;避免程序陷入…

免费送源码:Node.JS+Express+MySQL Express 流浪动物救助系统 计算机毕业设计原创定制

摘 要 随着互联网大趋势的到来&#xff0c;社会的方方面面&#xff0c;各行各业都在考虑利用互联网作为媒介将自己的信息更及时有效地推广出去&#xff0c;而其中最好的方式就是建立网络管理系统&#xff0c;并对其进行信息管理。由于现在网络的发达&#xff0c;流浪动物救助系…

python基础综合案例(数据可视化—折线图可视化)

可视化案例的学习目标&#xff1a; 通过案例&#xff0c;回忆巩固python基础的语法 锻炼编程能力&#xff0c;熟练语法的使用 1.json数据格式 两种不同的语言由于数据格式不同&#xff0c;所以没有办法直接沟通&#xff0c;就比如我们可以将python 的数据格式转成json&…

VirtualBox虚拟机桥接模式固定ip详解

VirtualBox虚拟机桥接模式固定ip详解 VirtualBox 桥接设置Ubuntu 24.04使用固定IP问题记录 VirtualBox 桥接设置 为什么设置桥接模式&#xff1f;桥接模式可以实现物理机和虚拟机互相通信&#xff0c;虚拟机也可以访问互联网&#xff08;推荐万金油&#xff09;&#xff0c;物…

STM32通信协议-I2C

目录 一&#xff0c;IC2的协议规则 I2C总线是PHILIPS公司开发的两线式串行总线&#xff0c;I2C总线主要解决了单片机一对多通信的问题 两根通信线&#xff1a;SCL,SDA&#xff0c;同步&#xff0c;半双工通信&#xff0c;支持数据应答机制&#xff0c;支持总线挂载多设备。 …

Verilog:参数(parameter)的使用

相关阅读 Verilog基础https://blog.csdn.net/weixin_45791458/category_12263729.html?spm1001.2014.3001.5482 参数(parameter)一般用于定义常数&#xff0c;常用于进行可配置的参数化设计中&#xff0c;本文将对参数的使用进行详细介绍。 首先来看看参数的BNF范式&#xff…

Hadoop 安装教程——单节点模式和分布式模式配置

文章目录 一、预备知识1.1 Hadoop 发行版本1.2 部署方式 二、预备条件2.1 环境准备2.2 创建新用户(可选)2.3 配置 SSH 无密码登录2.4 下载 Hadoop2.5 编辑 hadoop-env.sh 脚本2.6 编辑 dfs 和 yarn 脚本 三、单节点模式部署3.1 官方使用案例3.2 查看运行结果 四、伪分布模式部署…