商城网站源文件下载/上海营销公司
🔥个人主页: Forcible Bug Maker
🔥专栏: STL || C++
目录
- 🌈前言
- 🌈关于set
- 🔥容量函数
- ==empty==
- ==size==
- 🔥Modifiers
- ==insert==
- ==erase==
- ==clear==
- 🔥Operations
- ==find==
- ==count==
- ==lower_bound和upper_bound==
- ==equal_range==
- 🌈关于multiset
- 🌈结语
🌈前言
本篇博客主要内容:STL库中set的介绍以及其用法的讲解。
set和map的底层结构是红黑树,而红黑树又是一种特殊的二叉搜索树(红黑树可以保持树的平衡)。而我们今天来学习什么是set,以及如何使用set这个容器。如果对二叉搜索树不了解,可以参考这篇:【数据结构进阶】二叉搜索树
🌈关于set
- set是按照一定次序存储元素的容器
- 在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。
- 在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序。
- set容器通过key访问单个元素的速度通常比unordered_set容器慢,但它们允许根据顺序对子集进行直接迭代。
- set在底层是用二叉搜索树(红黑树)实现的。
🔥容量函数
empty
判断set对象是否为空。
#include<iostream>
#include<set>
using namespace std;int main()
{set<int> se;cout << se.empty() << endl;se.insert(1);cout << se.empty() << endl;return 0;
}
size
返回set对象中的元素个数。
#include <iostream>
#include <set>int main ()
{std::set<int> myints;std::cout << "0. size: " << myints.size() << '\n';for (int i=0; i<10; ++i) myints.insert(i);std::cout << "1. size: " << myints.size() << '\n';myints.insert (100);std::cout << "2. size: " << myints.size() << '\n';myints.erase(5);std::cout << "3. size: " << myints.size() << '\n';return 0;
}
🔥Modifiers
insert
支持三种重载:
single element (1)
单个元素插入
pair<iterator,bool> insert (const value_type& val);
with hint (2)
暗示插入
iterator insert (iterator position, const value_type& val);
range (3)
迭代器区间插入
template <class InputIterator>void insert (InputIterator first, InputIterator last);
// set::insert (C++98)
#include <iostream>
#include <set>int main ()
{std::set<int> myset;std::set<int>::iterator it;std::pair<std::set<int>::iterator,bool> ret;// set some initial values:for (int i=1; i<=5; ++i) myset.insert(i*10); // set: 10 20 30 40 50ret = myset.insert(20); // no new element insertedif (ret.second==false) it=ret.first; // "it" now points to element 20myset.insert (it,25); // max efficiency insertingmyset.insert (it,24); // max efficiency insertingmyset.insert (it,26); // no max efficiency insertingint myints[]= {5,10,15}; // 10 already in set, not insertedmyset.insert (myints,myints+3);std::cout << "myset contains:";for (it=myset.begin(); it!=myset.end(); ++it)std::cout << ' ' << *it;std::cout << '\n';return 0;
}
erase
(1)
通过迭代器指向直接删除
void erase (iterator position);
(2)
通过值的查找删除,同时返回删除元素的个数
size_type erase (const value_type& val);
(3)
迭代器区间删除
void erase (iterator first, iterator last);
#include <iostream>
#include <set>int main ()
{std::set<int> myset;std::set<int>::iterator it;// insert some values:for (int i=1; i<10; i++) myset.insert(i*10); // 10 20 30 40 50 60 70 80 90it = myset.begin();++it; // "it" points now to 20myset.erase (it);myset.erase (40);it = myset.find (60);myset.erase (it, myset.end());std::cout << "myset contains:";for (it=myset.begin(); it!=myset.end(); ++it)std::cout << ' ' << *it;std::cout << '\n';return 0;
}
clear
将set对象中所有的元素清空。
size变为0。
#include <iostream>
#include <set>int main ()
{std::set<int> myset;myset.insert (100);myset.insert (200);myset.insert (300);std::cout << "myset contains:";for (std::set<int>::iterator it=myset.begin(); it!=myset.end(); ++it)std::cout << ' ' << *it;std::cout << '\n';myset.clear();myset.insert (1101);myset.insert (2202);std::cout << "myset contains:";for (std::set<int>::iterator it=myset.begin(); it!=myset.end(); ++it)std::cout << ' ' << *it;std::cout << '\n';return 0;
}
🔥Operations
find
查找set对象中的某个元素,返回指向此元素的迭代器;如不存在,返回迭代器set::end
。
#include <iostream>
#include <set>int main ()
{std::set<int> myset;std::set<int>::iterator it;// set some initial values:for (int i=1; i<=5; i++) myset.insert(i*10); // set: 10 20 30 40 50it=myset.find(20);myset.erase (it);myset.erase (myset.find(40));std::cout << "myset contains:";for (it=myset.begin(); it!=myset.end(); ++it)std::cout << ' ' << *it;std::cout << '\n';return 0;
}
count
查找并返回set对象中和val值相等的值的个数。
#include <iostream>
#include <set>int main ()
{std::set<int> myset;// set some initial values:for (int i=1; i<5; ++i) myset.insert(i*3); // set: 3 6 9 12for (int i=0; i<10; ++i){std::cout << i;if (myset.count(i)!=0)std::cout << " is an element of myset.\n";elsestd::cout << " is not an element of myset.\n";}return 0;
}
在set中,此函数显得比较没用,因为set中每个元素最多只有一个。但是在mutiset中就大不相同了,mutiset允许数据冗余。
lower_bound和upper_bound
iterator lower_bound (const value_type& val) const;
返回set对象中 大于等于(>=)val 的第一个元素的迭代器·。
iterator upper_bound (const value_type& val) const;
返回set对象中 大于(>)val 的第一个元素的迭代器。
// set::lower_bound/upper_bound
#include <iostream>
#include <set>int main ()
{std::set<int> myset;std::set<int>::iterator itlow,itup;for (int i=1; i<10; i++) myset.insert(i*10); // 10 20 30 40 50 60 70 80 90itlow=myset.lower_bound (30); // ^itup=myset.upper_bound (60); // ^myset.erase(itlow,itup); // 10 20 70 80 90std::cout << "myset contains:";for (std::set<int>::iterator it=myset.begin(); it!=myset.end(); ++it)std::cout << ' ' << *it;std::cout << '\n';return 0;
}
equal_range
pair<iterator,iterator> equal_range (const value_type& val) const;
返回一个pair,其中是与val值相等的set对象的迭代器区间。
// set::equal_elements
#include <iostream>
#include <set>int main ()
{std::set<int> myset;for (int i=1; i<=5; i++) myset.insert(i*10); // myset: 10 20 30 40 50std::pair<std::set<int>::const_iterator,std::set<int>::const_iterator> ret;ret = myset.equal_range(30);std::cout << "the lower bound points to: " << *ret.first << '\n';std::cout << "the upper bound points to: " << *ret.second << '\n';return 0;
}
🌈关于multiset
- multiset是按照特定顺序存储元素的容器,其中元素是可以重复的。
- 在multiset中,元素的value也会识别它(因为multiset中本身存储的就是<value, value>组成的键值对,因此value本身就是key,key就是value,类型为T). multiset元素的值不能在容器中进行修改(因为元素总是const的),但可以从容器中插入或删除。
- 在内部,multiset中的元素总是按照其内部比较规则(类型比较)所指示的特定严格弱排序准则进行排序。
- multiset容器通过key访问单个元素的速度通常比unordered_multiset容器慢,但当使用迭代器遍历时会得到一个有序序列。
- multiset底层结构为二叉搜索树(红黑树)。
总的来说,multiset
与set
的区别是,multiset
中的元素可以重复,set
中value是唯一的。同时,成员函数count()
和equal_range()
在mutiset中也更有其意义。
这里就不再赘述关于multiset
的使用了。
🌈结语
本篇博客我们介绍了STL库中set和multiset,以及set成员函数接口的使用。multiset支持数据冗余,而set中的值(value)是唯一的。感谢大家支持♥
相关文章:

【C++】set的使用
🔥个人主页: Forcible Bug Maker 🔥专栏: STL || C 目录 🌈前言🌈关于set🔥容量函数emptysize 🔥Modifiersinserteraseclear 🔥Operationsfindcountlower_bound和upper_…...

React 18【实用教程】(2024最新版)
搭建开发环境 含配置,react-developer-tools 和 Redux DevTools 下载安装 https://blog.csdn.net/weixin_41192489/article/details/138523829 JSX 语法 https://blog.csdn.net/weixin_41192489/article/details/138649165 组件 父子组件传值、兄弟组件传值、越层组…...

Perl语言入门学习指南
Perl语言(Practical Extraction and Report Language)是一种强大的脚本语言,以其灵活性和强大的文本处理能力而闻名。Perl广泛应用于系统管理、Web开发、网络编程和数据处理等领域。本文将带您入门Perl语言,介绍其基本语法、常用功…...

《Java8函数式编程》学习笔记汇总
前言 见证了java8的多层排序,为此想系统学习下java8的用法。 目录 简介Lambda表达式流高级集合类和收集器数据并行化测试、调试和重构设计和架构的原则使用Lambda表达式编写并发程序下一步改怎么办 后记...

C语言之封装,继承,多态
本文参考: c语言面向对象之封装c面向对象之继承Linux源码分析之多态 一、封装 封装的本质就是将数据和方法集中到一个对象中,c或者java使用的是class来实现。c语言中可以使用struct来实现同样的功能。比如下面的程序: struct student {int…...

GO内存分配详解
文章目录 GO内存分配详解一. 物理内存(Physical Memory)和虚拟内存(Virtual Memory)二. 内存分配器三. TCMalloc线程内存(thread memory)页堆(page heap)四. Go内存分配器mspanmcachemcentralmheap五. 对象分配流程六. Go虚拟内存ArenaGO内存分配详解 这篇文章中我将抽丝剥茧,…...

每日Attention学习12——Exterior Contextual-Relation Module
模块出处 [ISBI 22] [link] [code] Duplex Contextual Relation Network for Polyp Segmentation 模块名称 Exterior Contextual-Relation Module (ECRM) 模块作用 内存型特征增强模块 模块结构 模块思想 原文表述:在临床环境中,不同样本之间存在息肉…...

为什么现在电销公司这么难?
现在电销公司普遍底薪就4000,员工要干的工作: 1、自己办卡、现在大部分人对隐私方面比较在意,一般电销公司还都需要自己身份证实名办卡,打几天又封号,有的人甚至被移动拉黑 2、天天打电话,遇见的什么人都…...

每天一个数据分析题(四百四十二)- 标签与指标
数据分析师在工作中常常会涉及两个概念:标签、指标,下面关于标签与指标的描述正确的是()? A. 指标通常可以量化,但是标签一般是不可量化的 B. 标签是用来定义、评价和描述特定事物的一种标准或方式 C. 指…...

[论文笔记] pai-megatron-patch Qwen2-72B/7B/1.5B 长文本探路
[论文笔记] Pai-megatron-patch cpu-offload 改到 Qwen2-CSDN博客 Pai-Megatron-Patch (mcore代码) 长文本限制: 开SP之后,72B能开到16K,7B能开到32K。 但是72B开16K,或者7B开32K时,如果训练时训练样本中有长文本的话,则还是会OOM。 code: 相对于原repo加了一些代…...

【SpringCloud】微服务远程调用OpenFeign
工作原理流程图 上代码 common中添加依赖: <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <dependency><groupId>org.spri…...

MySQL零散拾遗(四)
聚合函数 聚合函数作用于一组数据,并对一组数据返回一个值。 常见的聚合函数:SUM()、MAX()、MIN()、AVG()、COUNT() 对COUNT()聚合函数的更深一层理解 COUNT函数的作用:计算指定字段在查询结果中出现的个数(不包含NULL值&#…...

大语言模型-检索测评指标
1. MRR (Mean Reciprocal Rank)平均倒数排名: 衡量检索结果排序质量的指标。 计算方式: 对于每个查询,计算被正确检索的文档的最高排名的倒数的平均值,再对所有查询的平均值取均值。 意义: 衡量…...

Zookeeper集群中节点之间数据是如何同步的
1.首先集群启动时,会先进行领导者选举,确定哪个节点是Leader,哪些节点是Follower和Observer 2.然后Leader会和其他节点进行数据同步,采用发送快照和发送Diff日志的方式 3.集群在工作过程中,所有的写请求都会交给Lead…...

HTTPServer改进思路2(mudou库核心思想融入)
mudou网络库思想理解 Reactor与多线程 服务器构建过程中,不仅仅使用一个Reactor,而是使用多个Reactor,每个Reactor执行自己专属的任务,从而提高响应效率。 首先Reactor是一种事件驱动处理模式,其主要通过IO多路复用…...

Kubernetes Secret 详解
Kubernetes Secret 是一种用于存储和管理敏感信息的对象,如密码、OAuth 令牌和 SSH 密钥等。使用 Secret 可以避免将机密数据直接放在 Pod 规约或容器镜像中,从而增加了应用程序的安全性。 Secret 的类型 Kubernetes 支持多种类型的 Secret,包括: Opaque:默认的…...

docker笔记4-部署
docker笔记4-部署 一、部署nginx二、部署Tomcat三、部署ESKibana3.1 部署ES3.2 部署kibana 一、部署nginx docker search nginx #搜索nginx的最新版本docker pull nginx #这里可以指定nginx版本,如果不指定,那么就拉取最新版本latestdocker run -d --na…...

有监督学习基础
基本概念 给定输入有为(x,y),其中x表示学习特征,y表示输出,m表示输入总数,有监督学习旨在根据输入建立能够预测可能输出的模型,大致可以分为回归和分类两种,代表可能输出是无限的或…...

揭开 AI 绘画提示词的神秘密码!
前言 ** 揭秘AI 绘画 ** 提示词的神秘密码 亲爱的朋友们,今天我们要一起探索 AI 绘画世界中那神秘的“密码”——提示词。 在 AI 绘画的奇妙领域里,提示词就像是一把神奇的钥匙,能够开启无尽的创意之门。它是我们与 AI 进行心灵对话的桥…...

macOS 10.15中屏蔽Microsoft Edge浏览器的更新提示
文章目录 1.效果对比2.安装描述文件3.停用描述文件4.高级操作(可选)参考文献 最近在macOS10.15系统,打开Microsoft Edge浏览器,每次打开都有个烦人的提示“ 要获取将来的 microsoft edge 更新,需要 macos 10.15 或更高…...

Qt 实战(3)数据类型 | 3.2、QVariant
文章目录 一、QVariant1、存储数据1.1、存储Qt内置数据1.2、存储自定义数据 2、获取数据3、判断数据类型4、清空数据5、总结 前言: QVariant是Qt框架中一个非常强大且灵活的类,它提供了一种通用的方式来存储和转换几乎任何类型的数据。无论是基本数据类型…...

Docker中安装的postgresql14在启用vector扩展的时候,找不到该扩展的控制文件。
ERROR: could not open extension control file “/usr/share/postgresql/14/extension/vector.control”: No such file or directory 进入容器 docker exec -it CONTAINER ID /bin/bash 1.更新 apt-get apt-get update 2.安装插件 #不同版本对应修改数字即可 apt-get i…...

JS防抖和节流
一、防抖和节流的适用场景 防抖(Debounce): 适合在输入框输入时的实时搜索、窗口大小调整时的resize事件等。节流(Throttle): 适合如页面滚动时的scroll事件、按钮点击时的请求发送等需要控制频率的场景。 …...

OpenWrt 为软件包和docker空间扩容
参考资料 【openwrt折腾日记】解决openwrt固件刷入后磁盘空间默认小的问题,关联openwrt磁盘扩容空间扩容【openwrt分区扩容】轻松解决空间可用不足的尴尬丨老李一瓶奶油的YouTube 划分空间 参考一瓶奶油的YouTube 系统 -> 磁盘管理 -> 磁盘 -> 修改 格…...

重要的工作任务,怎么在电脑桌面设置倒计时?
在日常工作中,我们总是面临着众多工作任务,如何高效地管理和完成这些任务成为了每个职场人的必备技能。为任务设置倒计时,不仅能让我们清晰地看到任务的先后顺序,还能帮助我们更好地把握时间,提高工作效率。想象一下&a…...

Failed to build get_cli:get:的解决方案
项目场景: 今天安装Getx命令行的时候,输入这面文档报了一个错: dart pub global activate get_cli 问题描述 提示:这里描述项目中遇到的问题: 例如:数据传输过程中数据不时出现丢失的情况,偶尔…...

短视频矩阵源码技术分享
在当今数字媒体时代,短视频已成为吸引观众和传递信息的重要手段。对于开发者而言,掌握短视频矩阵源码技术不仅是提升自身技能的需要,更是把握行业发展趋势的必然选择。本文将深入探讨短视频矩阵源码的关键技术要点及其实现方法,帮…...

轮播图自定义内容
官网:Swiper演示 - Swiper中文网 下载: npm i swiper Vue3示例代码: <template><div class"swiper mySwiper"><div class"swiper-wrapper"><div class"swiper-slide"><div>…...

大数据-44 Redis 慢查询日志 监视器 慢查询测试学习
点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…...

Istio_01_Istio初识
文章目录 IstioService Mesh Istio Istio: 以服务网格形态用于服务治理的开放平台和基础设施 本质: 以非侵入式治理服务之间的访问和调用服务治理: 流量管理、可观测性、安全性可同时管理多类基础设施(多种网络方案) 如: Istio和Kubernetes架构的结合 Istio通过Kubernetes的域…...