一文看懂STL标准模板中的set用法(C++)详细源码与例题

news2024/9/23 3:18:57

在 C++ 中,集合通常指的是标准模板库(STL)中的 std::set 或 std::unordered_set。这两个都是用来存储不重复元素的容器,但在实现和使用方式上有一些区别。

集合(set)是一个内部自动有序且不含重复元素的容器,它可以在需要删除重复元素的情况下大放异彩,节省时间,减少思维量。

set 就是关键字的简单集合,当只是想知道一个值是否存在时,set 是最有用的。

顺序容器包括 vector、list、forward_list、array、string,所有顺序容器都提供了快速顺序访问元素的能力;关联容器包括 set、map

标准库提供 set 关联容器分为:

按关键字有序保存元素:set(关键字即值,即只保存关键字的容器)、multiset(关键字可重复出现的 set);

无序集合:unordered_set(用哈希函数组织的 set)、unordered_multiset(用哈希函数组织的 set,关键字可以重复出现)。

图片

图片

代码演示如下:

#include <iostream>#include <set>using namespace std;int main(){  set<int> s;  s.insert(5);  s.insert(2);  s.insert(6);  for (set<int>::iterator it = s.begin(); it != s.end(); it++){    cout << *it << " ";  }  return 0;}

使用时需包含头文件:​​​​​​​

#include <set>using namespace std;


std::set:

•元素按照严格的顺序(默认是升序)排列。

•插入、查找、删除操作的平均时间复杂度为 O(log n)。

•不支持直接修改元素的值,但可以通过删除再插入的方式来实现。

std::unordered_set:

•基于哈希表实现,元素无序存储。

•插入、查找、删除操作的平均时间复杂度为 O(1)。

•元素类型必须支持哈希函数,或者提供自定义的哈希函数。

3.要判断一个元素是否在集合中

使用集合的 find() 函数。这个函数会返回一个迭代器,如果找到了元素,则返回指向该元素的迭代器;如果未找到,则返回集合的 end() 迭代器。

4.erase():可 以删除单个元素或删除一个区间内的所有元素

删除单个元素:

1.st.erase(it),其中 it 为所需要删除元素的迭代器。时间复杂度为 O(1),可以结合 find() 函数来使用。

2.st.erase(value),其中 value 为所需要删除元素的值。时间复杂度为 O(logN),N 为 set 内的元素个数。

#include <iostream>#include <set>using namespace std;int main(){  set<int> st;  st.insert(100);  st.insert(200);  st.insert(100);  st.insert(300);  st.insert(500);  // 删除单个元素  st.erase(st.find(100)); // 利用find()函数找到100,然后用erase删除它  st.erase(200); // 删除值为200的元素  for (set<int>::iterator it = st.begin(); it != st.end(); it++)  {    cout << *it << " ";  }  return 0;}// 输出结果300 500

删除一个区间内的所有元素:

st.erase(iteratorBegin, iteratorEnd),其中 iteratorBegin 为所需要删除区间的起始迭代器, iteratorEnd 为所需要删除区间的结束迭代器的下一个地址,即取 [iteratorBegin, iteratorEnd​​​​​​​

#include <iostream>#include <set>using namespace std;int main(){  set<int> st;  st.insert(100);  st.insert(200);  st.insert(100);  st.insert(300);  st.insert(500);  set<int>::iterator it = st.find(300);  // 删除一个区间内的所有元素  st.erase(it, st.end());  for (it = st.begin(); it != st.end(); it++)  {    cout << *it << " ";  }  return 0;}

题目描述

给定 n 个数,要求把其中重复的去掉,只保留第一次出现的数。

输入格式

本题有多组数据。

第一行一个整数 TT,表示数据组数。

对于每组数据:

第一行一个整数 nn。

第二行 nn 个数,表示给定的数。

输出格式

对于每组数据,输出一行,为去重后剩下的数,两个数之间用一个空格隔开。

输入输出样例

输入 #1复制

2
11
1 2 18 3 3 19 2 3 6 5 4
6
1 2 3 4 5 6

输出 #1复制

1 2 18 3 19 6 5 4
1 2 3 4 5 6

#include <iostream>#include <set>#include <vector>using namespace std;
int T;
int main(){    cin >> T;    while(T--){        int n;        cin >> n;
        vector<int> num(n);        for(int i=0; i < n;i++){            cin >> num[i];        }
        set<int> seen; // 记录已经出现的数字        vector<int> res;
        for(int i=0;i < n;i++){            if(seen.find(num[i]) == seen.end() ){                res.push_back(num[i]);                seen.insert(num[i]); // 标记为已经出现过            }        }        for(int i=0;i < res.size();i++){            if(i > 0) cout << " ";            cout << res[i];        }        cout << endl;    }}

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

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

相关文章

C++的STL简介(三)

目录 1.vector的模拟实现 1.1begin&#xff08;&#xff09; 1.2end&#xff08;&#xff09; 1.3打印信息 1.4 reserve&#xff08;&#xff09; 1.5 size&#xff08;&#xff09; 1.6 capacity&#xff08;&#xff09; 1.7 push_back() 1.8[ ] 1.9 pop_back() 1.10 insert&…

扑克游戏(函数规范化,拆分事件)

前言&#xff1a; 题目链接 进入链接后&#xff0c;点击实践项目&#xff0c;以下两道题分别为6.8.15和6.8.16, 这两道题算不上难&#xff0c;特别是第二道在之前某个比赛中遇到过一次&#xff0c;当时没做出来&#xff0c;想着去找的&#xff0c;没找着&#xff0c;现在又看…

Midjourney小技巧-提升出图质量的常用公式

一个公式让你的Midjourney生成更具韵味的人像身影图 step1-测试&#xff1a;输入提示词 - 一个面容精致的亚洲女性 - An Asian woman with a delicate face 生成的图片还是挺唯美的&#xff0c;就是过于单调&#xff0c;稀疏平常 step2-使用公式&#xff1a; 谁谁&#xff0…

Windows调大虚拟内存来代替升级物理运行内存(RAM)真的有用吗?

前言 前段时间有个粉丝突发奇想说&#xff1a;电脑运行内存不足&#xff0c;调大虚拟内存来代替升级物理运行内存&#xff08;内存条&#xff09;不就可以了&#xff1f;剩下的大几百块钱吃香的喝辣的不好吗&#xff1f; 嗯。。。直到2024年的今天&#xff0c;估计还有很多小…

微信VX多开 免扫码 登录 互斥体 可视化 Exui v1.1 易语言源码附成品软件

UI设计&#xff1a; 1. EXUI界面库20240204 调用的模块&#xff1a; 1. wow64_hook_3.02.ec&#xff08;压缩包内含&#xff09; 2. 精易模块[v11.1.0].ec&#xff08;自行下载&#xff09; 更新日志&#xff1a; v1.1 2024年7月25日13:28:43 { 1. 有人反馈 设置了V…

“论数据湖技术及其应用”写作框架,软考高级论文系统架构设计师论文

论文真题 近年来&#xff0c;随着移动互联网、物联网、工业互联网等技术的不断发展&#xff0c;企业级应用面临的数据规模不断增大&#xff0c;数据类型异常复杂。针对这一问题&#xff0c;业界提出“数据湖&#xff08;Data Lake)”这一新型的企业数据管理技术。数据湖是一个…

YOLOv1-v5总结

文章目录 1、yolov11.2、预测阶段1.3、后处理阶段1.4、模型训练阶段1.5、损失函数1.6、yolov1网络1.7、为什么使用1*1的卷积&#xff1f; 2、yolov22.1、添加BN层2.2、高分辨力分类器&#xff08;仅仅使用分类而不是目标检测&#xff09;2.3、anchor机制2.4、关于anchor boxes&…

Python 爬虫项目实战(二):爬取微博热搜榜

前言 网络爬虫&#xff08;Web Crawler&#xff09;&#xff0c;也称为网页蜘蛛&#xff08;Web Spider&#xff09;或网页机器人&#xff08;Web Bot&#xff09;&#xff0c;是一种按照既定规则自动浏览网络并提取信息的程序。爬虫的主要用途包括数据采集、网络索引、内容抓…

iPhone苹果密码解锁工具专业版_不限制电脑

iPhone苹果密码解锁工具专业版_不限制电脑 Aiseesoft iPhone Unlocker&#xff1a;轻松解锁iPhone。功能强大&#xff1a;一键移除4位、6位密码、Touch ID和Face ID。 隐私保护&#xff1a;创建密码&#xff0c;安全无忧。数据提醒&#xff1a;解锁时&#xff0c;注意数据和设…

自制安卓车机软件(含APP)

本软件使用APPinventor2编程软件&#xff0c;耗时5天和3天调试&#xff0c;具有高德导航&#xff0c;视频播放&#xff0c;网易云音乐&#xff0c;酷狗&#xff0c;抖音&#xff0c;&#xff08;需下载车机版软件&#xff09;和自定义添加软件&#xff0c;网页有哔哩哔哩&#…

STM32F103 SPI详解及示例代码1

1 SPI协议详解 SPI是串行外设接口&#xff08;Serial Peripheral Interface&#xff09;的缩写&#xff0c;是美国摩托罗拉公司&#xff08;Motorola&#xff09;最先推出的一种同步串行传输规范&#xff0c;也是一种单片机外设芯片串行扩展接口&#xff0c;是一种高速、全双工…

学习笔记-JWT 保持登录状态

目录 一、解析 token 1. 在 JWT 工具类添加解析 token 的方法 2. 在 Controller 添加获取用户数据的方法 二、获取用户信息 1. 发起 axios 请求用户信息 2. 在路由守卫中调用方法 3. 使用 三、token 时效性 1. 设置 token 过期时间 2. 判断 token 是否过期 3. 在拦截…

Golang是如何实现动态数组功能的?Slice切片原理解析

Hi 亲爱的朋友们&#xff0c;我是 k 哥。今天&#xff0c;咱们聊一聊Golang 切片。 当我们需要使用数组&#xff0c;但是又不能提前定义数组大小时&#xff0c;可以使用golang的动态数组结构&#xff0c;slice切片。在 Go 语言的众多特性里&#xff0c;slice 是我们经常用到的数…

基于MSER和HOG特征提取的SVM交通标志检测和识别算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 MSER 4.2 HOG特征提取 4.3 SVM 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 matlab2017b 3.部分核心程序 &#xff08;完整版代码包含中…

黑马头条vue2.0项目实战(四)——首页—文章列表

目录 1. 头部导航栏 1.1 页面布局 1.2 样式调整中遇到的问题 2. 频道列表 2.1 页面布局 2.2 样式调整 2.3 展示频道列表 3. 文章列表 3.1 思路分析 3.2 使用 List 列表组件 3.3 加载文章列表数据 3.4 下拉刷新 3.5 设置上下padding固定头部和频道列表 3.6 记住列…

48天笔试训练错题——day40

目录 选择题 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 编程题 1. 发邮件 2. 最长上升子序列 选择题 1. DNS 劫持又称域名劫持&#xff0c;是指在劫持的网络范围内拦截域名解析的请求&#xff0c;分析请求的域名&#xff0c;把审查范围以外的请求放行&#xff0c;否则返回…

大数据Flink(一百零七):阿里云Flink的应用场景

文章目录 阿里云Flink的应用场景 一、​​​​​​​背景信息 二、​​​​​​​​​​​​​​部门场景 三、​​​​​​​​​​​​​​技术领域 1、​​​​​​​​​​​​​​实时ETL和数据流 2、​​​​​​​​​​​​​​实时数据分析 3、​​​​​​​事…

8.3总结

1.改进渲染 这个渲染为了美观我做了很久花了好多时间&#xff0c;&#xff0c;&#xff0c; // 加载头像图像InputStream inputStream new ByteArrayInputStream(message.getFileBytes());Image image new Image(inputStream); // 第二个参数表示是否缓存图片&#xff0c;根…

达梦数据库dsc集群动态添加节点

前提条件&#xff1a;在安装好的的dsc集群&#xff1a;达梦数据库dsc集群保姆级部署文档_达梦数据库文档-CSDN博客上动态添加节点 1、环境信息 扩展节点信息&#xff1a; 操作环境&#xff1a;VMware Workstation 16 Pro dmdsc集群 机器ip 主机名 操作系统 资源配置 实…

mac中dyld[5999]: Library not loaded: libssl.3.dylib解决方法

需要重新安装下openssl3.0版本 brew reinstall openssl3.0 安装后执行还是报错&#xff0c;需要找到openssl的安装路径 /opt/homebrew/Cellar/openssl3.0/3.0.14/lib/ 将libssl.3.dylib和libcrypto.3.dylib拷贝到自己的二进制文件同目录下&#xff0c;再执行二进制文件就可…