C++ STL(7)set

文章目录

  • 一、set
    • 1、简介
    • 2、迭代器
    • 3、常用操作
    • 4、应用示例

前言:

std::set是C++标准模板库(STL)中的一个关联容器,它存储唯一元素,并自动按升序排列。std::set通常用于需要快速查找、插入和删除元素的场景,同时保证元素的唯一性和有序性。

一、set

1、简介

std::set容器是一个包含唯一对象的集合,它自动维护元素的排序(默认递增)。具备下面的特点:

  • 元素无法直接修改,且不能重复。
  • 提供了高效的查找、插入和删除操作,时间复杂度通常为O(logn)
  • std::set容器底层通常使用红黑树实现。
  • std::set容器中,内存管理是由标准库自动处理的。插入元素时,容器会自动分配足够的内存来存储新插入的元素。删除元素时,容器会自动释放不再需要的内存。
  • 插入元素时,如果元素已存在,则插入操作不会执行,也不会分配新的内存。
  • std::set容器提供双向迭代器,不支持随机访问。迭代器在删除元素后可能会失效,因此在迭代过程中删除元素需要特别小心。

2、迭代器

#include <iostream>
#include <set>int main() {// 创建一个空的整数集合std::set<int> my_set;// 向集合中插入元素my_set.insert(3);my_set.insert(1);my_set.insert(4);my_set.insert(2);// 遍历并打印集合中的元素for (const int& num : my_set) {std::cout << num << " ";}return 0;
}

3、常用操作

  • insert(const T& value): 插入一个元素(如果元素已存在,则不会插入)。
  • clear(): 移除 set 中的所有元素。
  • erase(iterator pos):移除位于 pos 位置的元素。
  • erase(const T& value):移除值为 value 的元素(如果存在)。
  • swap(std::set<T>& other):交换两个 set 的内容。
  • size():返回 set 中元素的数量。
  • empty():检查 set 是否为空。
  • find(const T& value):查找值为 value 的元素,并返回指向它的迭代器(如果未找到,则返回 end())。
  • count(const T& value):返回值为 value 的元素的数量(对于 set,返回值要么是 0,要么是 1)。

4、应用示例

示例一:容器中存储的是自定义元素,查找给定的元素是否存在

创建一个std::set容器,容器存储的是Student对象,如何查找给定的元素是否存在,自定义Student需要注意下面的点

  • 需要重载<>运算符以支持set的排序。
  • 重载<>运算符时使用的字段,作为后续查找的key。例如:下面的示例,使用m_age字段作为排序的key,目标对象只要m_age字段与容器中的元素相等就能匹配的上。
struct Student
{
public:Student(const string &name, int age){m_name = name;m_age = age;}// 重载 < 运算符以支持 set 的排序bool operator<(const Student& other) const {return m_age < other.m_age;}private:string m_name;int m_age;
};int main()
{// 创建一个set容器set<Student> mySet;// 插入元素mySet.insert(Student("jams", 39));mySet.insert(Student("messi", 32));// 查找指定的元素Student target("zhangsan", 32);auto it = mySet.find(target);if (it != mySet.end())cout << "found" << endl;             // 输出结果:foundelsecout << "not found" << endl;return 0;
}

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

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

相关文章

ImportError: /lib/x86_64-linux-gnu/libm.so.6: version `GLIBC_2.29‘ not found

3.一、编译安装make 以make4.2 2.2.1为例 1.下载make wget https://ftp.gnu.org/gnu/make/make-4.2.tar.gz 2.解压make4.2安装包 tar -zxvf make-4.2.tar.gz && cd make-4.2 3.编译安装make-4.2 ./configure --prefix/usr/local/make4.2 make && make …

一文解决Latex中的eps报错eps-converted-to.pdf not found: using draft setting.

在使用Vscode配的PDFLatex编译IEEE TII的Latex模板时&#xff0c;出现eps文件不能转换为pdf错误&#xff0c;看了几十篇方法都没用&#xff0c;自己研究了半天终于可以正常运行了。主要原因还是Settings.JSON中的PDFLatex模块缺少&#xff1a;"--shell-escape", 命令…

深度学习神经网络中的优化器的使用

深度学习:神经网络中的优化器的使用 在深度学习中&#xff0c;优化器是用于更新和调整模型参数&#xff08;例如权重和偏置&#xff09;的算法&#xff0c;目的是减小模型在训练数据上的损失函数值。优化器的核心目标是通过适当的算法快速有效地找到损失函数的最小值或近似最小…

Redis基本的全局命令

在学习redis基本的全局命令之前呢&#xff0c;我们必须先进入redis-cli客户端才行。 如图&#xff1a; get和set get和set是redis两个最核心的命令。 get&#xff1a;根据key来获取value。 set&#xff1a;把key和value存储进去。 如set命令如图&#xff1a; 对于上述图中&…

嵌入式开发人员如何选择合适的开源前端框架进行Web开发

在嵌入式系统的Web开发中&#xff0c;前端框架的选择对于项目的成败有着决定性的影响。一个合适的框架不仅能提高开发效率&#xff0c;还能保证系统的稳定性和可扩展性。本文将介绍几款适用于嵌入式Web开发的开源前端框架&#xff0c;并探讨它们的优缺点。 1. Element Plus V…

【数据结构OJ】【图论】图综合练习--拓扑排序

题目描述 已知有向图&#xff0c;顶点从0开始编号&#xff0c;求它的求拓扑有序序列。 拓扑排序算法&#xff1a;给出有向图邻接矩阵 1.逐列扫描矩阵&#xff0c;找出入度为0且编号最小的顶点v 2.输出v&#xff0c;并标识v已访问 3.把矩阵第v行全清0 重复上述步骤&#xff0…

XLNet——打破 BERT 局限的预训练语言模型

近年来&#xff0c;深度学习在自然语言处理&#xff08;NLP&#xff09;领域取得了革命性进展&#xff0c;其中 BERT 的出现标志着双向语言建模的强大能力。然而&#xff0c;BERT 也存在一些局限性&#xff0c;限制了其在生成任务中的表现。2019 年&#xff0c;由 Google 和 Ca…

力扣题目总结

1.游戏玩法分析IV AC: select IFNULL(round(count(distinct(Result.player_id)) / count(distinct(Activity.player_id)), 2), 0) as fraction from (select Activity.player_id as player_idfrom (select player_id, DATE_ADD(MIN(event_date), INTERVAL 1 DAY) as second_da…

量子计算来袭:如何保护未来的数字世界

目录 前言 一、量子计算安全的学习方向 1. 量子物理学基础 2. 量子计算原理与技术 3. 传统网络安全知识 4. 量子密码学 5. 量子计算安全政策与法规 二、量子计算的漏洞风险 1. 加密算法被破解风险 2. 区块链安全风险 3. 量子密钥分发风险 4. 量子计算系统自身风险 …

Elasticsearch面试内容整理-Elasticsearch 基础概念

Elasticsearch 是一个基于 Apache Lucene 的开源分布式搜索和分析引擎,提供强大的全文本搜索、实时数据分析、分布式存储等功能。以下是 Elasticsearch 的一些基础概念: 什么是 Elasticsearch? ● Elasticsearch 是一个用于全文搜索和实时分析的分布式搜索引擎。 ● 开源和可…

AJAX笔记 (速通精华版)

AJAX&#xff08;Asynchronous Javascript And Xml&#xff09; 此笔记来自于动力节点最美老杜 传统请求及缺点 传统的请求都有哪些&#xff1f; 直接在浏览器地址栏上输入URL。点击超链接提交 form 表单使用 JS 代码发送请求 window.open(url)document.location.href urlwi…

12、异常Exception:

12、异常Exception&#xff1a; 我们来看一段代码&#xff0c;了解下为什么需要异常处理&#xff1a; package com.jiangxian.Exception_;/*** author JiangXian~* version 1.0*/ public class Exception01 {public static void main(String[] args) {int num1 10;int num2 …

net某高校社交学习平台的设计与实现

摘 要 高校社交学习平台是一个融合了社交网络特性的在线学习交流系统&#xff0c;旨在促进高校学生之间的信息共享与学习互动。该平台通过提供学习资料、学习视频和学习交流等功能&#xff0c;支持发布学习动态、参与知识问答、并实时追踪学习进度。为学生提供一个全面且便捷的…

七、利用CSS和多媒体美化页面的习题

题目一&#xff1a; 利用CSS技术&#xff0c;结合表格和列表&#xff0c;制作并美化 “ 翡翠阁 ”页面。运行效果如下 运行效果&#xff1a; 代码 <!DOCTYPE html> <html><head><meta charset"utf-8" /><title>翡翠阁</title>&…

学习虚幻C++开发日志——委托(持续更新中)

委托 官方文档&#xff1a;Delegates and Lamba Functions in Unreal Engine | 虚幻引擎 5.5 文档 | Epic Developer Community | Epic Developer Community 简单地说&#xff0c;委托就像是一个“函数指针”&#xff0c;但它更加安全和灵活。它允许程序在运行时动态地调用不…

代替Spinnaker 的 POINTGREY工业级相机 FLIR相机 Python编程案例

SpinnakerSDK_FULL_4.0.0.116_x64 是一个用于FLIR相机的SDK&#xff0c;主要用于图像采集和处理。Spinnaker SDK主要提供C接口&#xff0c;无法直接应用在python环境。本文则基于Pycharm2019python3.7的环境下&#xff0c;调用opencv,EasySpin,PySpin,的库实现POINTGREY工业级相…

Linux:自定义Shell

本文旨在通过自己完成一个简单的Shell来帮助理解命令行Shell这个程序。 目录 一、输出“提示” 二、获取输入 三、切割字符串 四、执行指令 1.子进程替换 2.内建指令 一、输出“提示” 这个项目基于虚拟机Ubuntu22.04.5实现。 打开终端界面如图所示。 其中。 之前&#x…

在幸狐picomax SDK里面添加app

本次以onvifserver为例&#xff0c;在在幸狐picomax SDK里面添加app 具体步骤 修改编译器&#xff0c;把CCOMPILE&#xff0c; CPPCOMPILE&#xff0c; LINK 改为对应得编译器 把all 提到前面&#xff0c;保证在make得时候第一个执行得是all标签 install 分几步 创建out文件夹…

如何更改手机GPS定位

你是否曾想过更改手机GPS位置以保护隐私、玩游戏或访问受地理限制的内容&#xff1f;接下来我将向你展示如何使用 MagFone Location Changer 更改手机GPS 位置&#xff01;无论是在玩Pokmon GO游戏、发布社媒贴子&#xff0c;这种方法都快速、简单且有效。 第一步&#xff1a;下…

基于信号量与共享内存实现客户与服务器进程通信

基于信号量与共享内存实现客户与服务器进程通信 发送进程 代码 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <fcntl.h> #include <sys/mman.h> #include <semaphore.h>#define SH…