11、STL中的set使用方法

news2025/3/27 22:29:39

一、了解

set 是 C++ 标准模板库(STL)中提供的有序关联容器之一。基于红黑树(Red-Black Tree)实现,用于存储一组唯一的元素,并按照元素的值进行排序。

  • set的特性
    • 唯一性
      • 键是唯一的。无重复。
    • 有序性
      • 升序排列,因为红黑树的平衡性质。可以自定义排序规则
    • 插入元素
      • 如果元素已存在,就不会进行了
    • 不可修改键值
      • 键值都是const的。如果要修改,先删除要修改的元素,再插入要修改后的值。
  • 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;//1
    cout<<*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))

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

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

相关文章

操作系统——(管程、线程、进程通信)

目录 一、管程机制 &#xff08;1&#xff09;管程定义 &#xff08;2&#xff09;特点&#xff1a; 二、进程通信 &#xff08;1&#xff09;概念 &#xff08;2&#xff09;高级通信机制 三、线程 &#xff08;1&#xff09;概念 &#xff08;2&#xff09;与进程比较…

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 默认…

Web开发-JS应用原生代码前端数据加密CryptoJS库jsencrypt库代码混淆

知识点&#xff1a; 1、安全开发-原生JS-数据加密&代码混淆 2、安全开发-原生JS-数据解密安全案例 一、演示案例-WEB开发-原生JS&第三方库-数据加密 前端技术JS实现&#xff1a; 1、非加密数据大致流程&#xff1a; 客户端发送->明文数据传输-服务端接受数据->…

比特币牛市还在不在

在加密货币的风云世界里&#xff0c;比特币的一举一动始终牵动着投资者们的神经。近期比特币的涨幅动作&#xff0c;再次引发了市场对于牛市是否仍在延续的激烈讨论。 在深入探索比特币市场的过程中&#xff0c;获取全面且及时的资讯至关重要。您可以通过访问Techub News&#…

Python、MATLAB和PPT完成数学建模竞赛中的地图绘制

参加数学建模比赛时&#xff0c;很多题目——诸如统计类、数据挖掘类、环保类、建议类的题目总会涉及到地理相关的情景&#xff0c;往往要求我们制作与地图相关的可视化内容。如下图&#xff0c;这是21年亚太赛的那道塞罕坝的题目&#xff0c;期间涉及到温度、降水和森林覆盖率…

跨平台RTSP高性能实时播放器实现思路

跨平台RTSP高性能实时播放器实现思路 目标&#xff1a;局域网100ms以内超低延迟 一、引言 现有播放器&#xff08;如VLC&#xff09;在RTSP实时播放场景中面临高延迟&#xff08;通常数秒&#xff09;和资源占用大的问题。本文提出一种跨平台解决方案&#xff0c;通过网络层…

编写一个简单的chrome截图扩展

文件结构&#xff1a; screenshot |-- background.js ---> service_worker运行的js |-- images ---> 图片 | |-- logo-128x128.png | |-- logo-16x16.png | |-- logo-32x32.png | -- logo-48x48.png -- manifest.json --->…

吴恩达机器学习笔记复盘(六)梯度下降算法

简介 梯度下降&#xff08;Gradient Descent&#xff09;是一种常用的优化算法&#xff0c;广泛应用于机器学习、深度学习等领域&#xff0c;在这里是用于求J&#xff08;w,b&#xff09;局部最小值。 我自己觉得这样说有点过于抽象。换个直观点的说法就是&#xff0c;一个人…

【机器学习chp14 — 3】生成式模型—生成对抗网络GAN(超详细分析,易于理解,推导严谨,一文就够了)

目录 三、生成对抗网络 ( Generative Adversarial Networks&#xff0c;GAN ) 1、GAN的基本思想 &#xff08;1&#xff09;生成器与判别器的基本结构与演变 &#xff08;2&#xff09;“对抗”机制及名词由来 2、GAN训练的基本算法 &#xff08;1&#xff09;网络初始化与…

机器人打磨控制技术

工具姿态调整运动 法线方向对齐运动&#xff1a;机器人实时调整工具姿态&#xff0c;使打磨工具的轴线与工件曲面的法线方向一致。例如&#xff0c;在球面打磨时&#xff0c;工具需始终垂直于球面切线。角度补偿运动&#xff1a;针对倾斜或不规则曲面&#xff0c;通过调整机器人…

K8S学习之基础四十:K8S配置altermanager发送告警到钉钉群

配置altermanager发送告警到钉钉群 ​ 创建钉钉群&#xff0c;设置机器人助手(必须是管理员才能设置)&#xff0c;获取webhook webhook&#xff1a; https://oapi.dingtalk.com/robot/send?access_token25bed933a52d69f192347b5be4b2193bc0b257a6d9ae68d81619e3ae3d93f7c6…

Spring Boot + Spring Integration整合MQTT打造双向通信客户端

1. 概述 本文分两个章节讲解MQTT相关的知识&#xff0c;第一部份主要讲解MQTT的原理和相关配置&#xff0c;第二个章节主要讲和Spring boot的integration相结合代码的具体实现&#xff0c;如果想快速实现功能&#xff0c;可直接跳过第一章节查看第二章讲。 1.1 MQTT搭建 为了…

Java 填充 PDF 模版

制作 PDF 模版 安装 OnlyOffice 从 OnlyOffice 官网下载 OnlyOffice Desktop&#xff0c;安装过程很简单&#xff0c;一路下一步即可。用 OnlyOffice 制作 PDF 模版&#xff08;表单&#xff09; 使用 OnlyOffice 表单设计器&#xff0c;制作表单&#xff0c;如下图 注意命名…

Vulnhub-dedecms织梦通关攻略

姿势一、通过文件管理器上传WebShell 第一步&#xff1a;进入后台&#xff0c;找到文件管理器上传木马文件 第二步&#xff1a;使用蚁剑进行连接 #文件地址 http://localhost/dedecms/shell.php 姿势二、修改模板⽂件拿WebShell 第一步&#xff1a;修改模板文件&#xff0c;删除…

数据集获取

sklearn数据集 sklearn有四部分数据。其中sklearn的数据集有两部分真实的数据,一部分嵌入到了sklearn库中,即安装好sklearn后就自带了一部分数据,这些数据的规模比较小称为small toy datasets ,还有一部分数据是需要在网上下载的,sklearn提供了下载的api接口,这些数据规…

实验12深度学习

实验12深度学习 一、实验目的 &#xff08;1&#xff09;理解并熟悉深度神经网络的工作原理&#xff1b; &#xff08;2&#xff09;熟悉常用的深度神经网络模型及其应用环境&#xff1b; &#xff08;3&#xff09;掌握Anaconda的安装和设置方法&#xff0c;进一步熟悉Jupyte…

2024年消费者权益数据分析

&#x1f4c5; 2024年315消费者权益数据分析 数据见&#xff1a;https://mp.weixin.qq.com/s/eV5GoionxhGpw7PunhOVnQ 一、引言 在数字化时代&#xff0c;消费者维权数据对于市场监管、商家诚信和行业发展具有重要价值。本文基于 2024年315平台线上投诉数据&#xff0c;采用数…

零知识证明:区块链隐私保护的变革力量

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…

【CSS文字渐变动画】

CSS文字渐变动画 HTML代码CSS代码效果图 HTML代码 <div class"title"><h1>今天是春分</h1><p>正是春天到来的日子&#xff0c;花都开了&#xff0c;小鸟也飞回来了&#xff0c;大山也绿了起来&#xff0c;空气也有点嫩嫩的气息了</p>…

Qt 控件概述 QLabel

目录 QLabel显示类控件 label如何做到与窗口同步变化 边框 Frame QLabel显示类控件 ​​ ​​ textFormat &#xff1a;设置文件格式 ​ Pixmap &#xff1a;标签图片 label如何做到与窗口同步变化 Qt中对应用户的操作 &#xff1a; 事件和信号 拖拽窗口大小就会触发…