当前位置: 首页 > news >正文

C++ Set

定义

set不同于vector,strin,list这种存储容器,set是一种关联式容器,底层是搜二叉;

功能

set可以确定唯一的值,可以排序+去重。

接口

insert()

#include <iostream>
#include<set>
using namespace std;int main(int argc, char** argv) {set<int>s;s.insert(10);s.insert(2);s.insert(4);s.insert(1);set<int> ::iterator it=s.begin();for(;it<=s.end();it++){cout<<*it<<" ";}cout<<endl;return 0;
}

 警告:

 原因:

在C++中,std::set是一个有序的容器,它使用红黑树实现。s.end()返回的是指向最后一个元素之后的位置的迭代器,而不是指向最后一个元素本身的迭代器。因此,将it与s.end()进行比较时,应该使用不等于操作符!=而不是小于等于操作符<=。如果你使用it <= s.end()作为循环条件,当it指向最后一个元素之后的位置时,循环将继续执行,这将导致访问超出s的边界,引发未定义的行为。为了避免这种情况,应该使用it != s.end()作为循环条件,确保只在it指向有效元素时循环执行。

 修改:

set<int> ::iterator it=s.begin();for(;it!=s.end();it++){cout<<*it<<" ";}cout<<endl;

 

	s.insert(10);s.insert(2);s.insert(4);s.insert(1);

第二个1没有插入进去。

之前讲过set底层是一棵搜二叉,搜二叉特点cur比root大往右插,比root小往左插。

找到为空的地方插入节点,如果发现cur与root的value相同,那就返回false;

怎么接收返回值的?

inset()的类型是pair,pair的第一个参数叫 first ,返回类型是 iterator;

第二个参数叫second,返回类型是 bool

自己写一个看看:

erase()

erase有三种删除方式:迭代器删除,直接删除值,区间删除

 ps:

我们可以先用find找到要删除的数,再用erase()把这个数删除。

find()是如果找到这个数就把这个数返回,否则就返回最后一个数,即end;

it=s.find(4);if(it!=s.end()){s.erase(it);}	for(auto ch:s){cout<<ch<<" ";}

 如果要删除的这个数不存在或已经被删除如果迭代器所指向的元素被删除,则该迭代器失效。

此刻find return end,erase(end)会中断。

	s.erase(2);	it=s.find(2);s.erase(it);

 怎么知道是否删除成功呢?

erase()有一个返回值size_type:

size_type是无符号整型,也就是如果删除成功返回1,否则返回0:

lower_bound   upper_bound

	set<int> myset;set<int>::iterator itlow,itup;for (int i=1; i<10; i++)  // 10 20 30 40 50 60 70 80 90myset.insert(i*10);itlow=myset.lower_bound (30);                //       ^itup=myset.upper_bound (60);                 //                   ^myset.erase(itlow,itup);    // 10 20 70 80 90cout << "myset contains:";for (set<int>::iterator it=myset.begin(); it!=myset.end(); ++it)cout << ' ' << *it;cout << '\n';

可以看见是

lower_bound,upper_bound是[ )的状态,左开右闭。

lower_bound返回的肯定是30,upper_bound返回的肯定是70。

所以就会把[30,70)的值全部删除了。

如果这样呢?

  itlow=myset.lower_bound (25);        itup=myset.upper_bound (65);  

还是一样,删除[25,65)之间的数。

equal_range

set<int> myset;for (int i=1; i<=5; i++) myset.insert(i*10);   // myset: 10 20 30 40 50pair<std::set<int>::const_iterator,std::set<int>::const_iterator> ret;ret = myset.equal_range(30);cout << "the first bound points to: " << *ret.first << '\n';cout << "the second bound points to: " << *ret.second << '\n';

equal_range有两个参数,第一个参数lower返回一个>=value的数,第二个参数upper返回一个>value的数。

如果value=35,第一个返回值是>=35的值,因为数组里面没有35,所以返回40,第二个返回值是>35的值,所以返回40:

  ret = myset.equal_range(35);

count

count返回一个size_t,就是如果有valuer返回1,否则返回0:

 可以用来判断某个值是否存在:

	if(s.count(3)) cout<<"3在"<<endl;else cout<<"3不在"<<endl;

set不支持修改,因为被修改了就不是搜索树了:

multiset

set不可以插入重复的值,因为其底层是一个搜二叉,而multiset可以插入重复的值,可以理解为是一个变异的搜二叉:

	multiset<int>s;s.insert(10);s.insert(2);	s.insert(4);s.insert(1);s.insert(1);multiset<int> ::iterator it=s.begin();for(;it!=s.end();it++){cout<<*it<<" ";}cout<<endl;

插入重复的值,放在右边还是左边都可以,假如我们放右边,现在又要插入1个5,这个5放哪里:

虽然是变异的搜二叉,但仍然保持了有序这个特点,因此我们再插入1个5,它肯定和第一个5是挨着的,第一个5又是跟节点,搜二叉按中序走。

跟节点走完之后就是右子树,右子树又按 左->跟->右走,因此,我们想让第二个5和根节点挨着只需要把第二个5放到右子树的最左节点即可,如下图:-+

中序:2 5 5 8 8  8

erase()

直接使用erase也是把所有重复的值删掉:

s.erase(4);

如果用迭代器去查找删除,会删除中序的第一个重复值:

	it=s.find(4);if(it!=s.end()){s.erase(it);}

count

统计1的个数:

数组:111144int ret=myset.count(1);cout<<ret<<endl;输出:4

相关文章:

C++ Set

定义 set不同于vector,strin,list这种存储容器&#xff0c;set是一种关联式容器&#xff0c;底层是搜二叉&#xff1b; 功能 set可以确定唯一的值&#xff0c;可以排序去重。 接口 insert() #include <iostream> #include<set> using namespace std;int main…...

基于知识库的chatbot或者FAQ

背景 最近突然想做一个基于自己的知识库&#xff08;knowlegebase&#xff09;的chatbot或者FAQ的项目。未来如果可以在公司用chatgpt或者gpt3.5之后的模型的话&#xff0c;还可以利用gpt强大的语言理解力和搜索出来的用户问题的相关业务文档来回答用户在业务中的问题。 Chat…...

ZOC8 for Mac:超越期待的终端仿真器

在Mac上&#xff0c;一个优秀的终端仿真器是每位开发者和系统管理员的必备工具。ZOC8&#xff0c;作为一款广受好评的终端仿真器&#xff0c;以其强大的功能和易用性&#xff0c;已经在Mac用户中积累了良好的口碑。本文将为您详细介绍ZOC8的各项特性&#xff0c;以及为什么它会…...

织梦dedecms后台档案列表显示空白或显示不了文章的解决方法

织梦dedecms后台档案列表显示空白或显示不了文章的解决方法 dede/content_list.php空白解决方法如下 dede/content_list.php空白 在DEDE后台可以查看栏目文章&#xff0c;但是所有档案列表却为空白或者显示不了文章,如图所示&#xff1a; 后来找到dede/content_list.php,看了下…...

10本值得阅读的量化交易书籍

什么是量化交易&#xff1f; 量化交易是利用数学模型或算法来创建交易策略并进行交易。量化交易通常由大型机构交易员或对冲基金雇用&#xff0c;他们雇用大量的博士和工程师团队。从历史上看&#xff0c;量化交易领域一直非常隐秘&#xff0c;有效的想法往往受到公司的严密保…...

c++通过对象的地址初始化指针,需要对指针进行释放么(企业链表衍生)

在C中&#xff0c;如果你通过对象的地址来初始化指针&#xff0c;通常情况下是不需要手动释放指针的。这是因为对象的生存期与指针所指向的对象的生存期相关联。当对象超出其作用域或被销毁时&#xff0c;指向该对象的指针也会自动成为悬挂指针&#xff0c;这种情况下再访问该指…...

CentOS安装MySQL

参考官方链接&#xff1a;https://dev.mysql.com/doc/refman/8.0/en/linux-installation-rpm.html CentOS版本 [rootlocalhost ~]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) 下载MySQL安装包&#xff08;版本&#xff1a;8.0.35&#xff09; 访问地址…...

AI:45-基于深度学习的声纹识别

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌本专栏包含以下学习方向: 机器学习、深度学…...

Spring-cloud-openfeign拦截器RequestInterceptor接口

RequestInterceptor接口位于包io.github.openfeign-core下&#xff0c;使用Spring Cloud Feign的时候会自动依赖这个包 下面的代码会在每次调用Feign1的m1方法时&#xff0c;向HTTP头追加键值对武汉3:晴川历历汉阳树 FeignClient(value "feignA", url "XXX或…...

自动化测试开发 —— 如何封装自动化测试框架?

封装自动化测试框架&#xff0c;测试人员不用关注框架的底层实现&#xff0c;根据指定的规则进行测试用例的创建、执行即可&#xff0c;这样就降低了自动化测试门槛&#xff0c;能解放出更多的人力去做更深入的测试工作。本篇文章就来介绍下&#xff0c;如何封装自动化测试框架…...

Leetcode—2.两数相加【中等】

2023每日刷题&#xff08;十五&#xff09; Leetcode—2.两数相加 迭代法实现代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l…...

拷贝音频、视频、word等二进制文件的实现方法,不掉帧

拷贝音频、视频、word等二进制文件的实现方法&#xff1a; 演示使用BufferedOutputStream 和 BufferedInputStream 使用 使用他们&#xff0c;可以完成二进制文件 思考&#xff1a;字节流可以操作二进制文件&#xff0c;可以操作文本文件吗&#xff1f;True public class B…...

dmfldr-快速装载-载入(DM8:达梦数据库)

dmfldr-快速装载-DM8:达梦数据库 介绍1 准备数据文件2 根据数据文件在数据库创建表3 根据数据文件,配置快速装载的控制文件4 在数据库bin执行目录执行命令5 日志6 达梦数据库学习使用列表 介绍 DM 提供了快速装载工具&#xff1a;dmfldr&#xff1b;通过使用快速装载工具能够把…...

Postman测试金蝶云星空Webapi【协同开发云】

文章目录 Postman测试金蝶云星空Webapi【协同开发云】环境说明业务背景大致流程具体操作请求登录接口请求标准接口查看保存提交审核反审核撤销 请求自定义接口参数是字符串参数是实体类单个实体类实体类是集合 其他 Postman测试金蝶云星空Webapi【协同开发云】 环境说明 金蝶…...

mongo常用操作符及查询例子

比较操作符&#xff1a; $eq&#xff1a;匹配字段值等于指定值。 $ne&#xff1a;匹配字段值不等于指定值。 $gt&#xff1a;匹配字段值大于指定值。 $gte&#xff1a;匹配字段值大于或等于指定值。 $lt&#xff1a;匹配字段值小于指定值。 $lte&#xff1a;匹配字段值小于或等…...

41.排序练习题(王道2023数据结构第8章综合练习)

试题1&#xff08;王道8.3.3节综合练习2&#xff09;&#xff1a; 编写双向冒泡排序算法&#xff0c;在正反两个方向交替扫描。即第一趟把关键字最大的元素放在序列的最后面&#xff0c;第二趟把关键字最小的元素放在序列最前面&#xff0c;如此反复。 首先实现冒泡排序&…...

python爬虫,如何在代理的IP被封后立刻换下一个IP继续任务?

前言 在实际的爬虫应用中&#xff0c;爬虫程序经常会通过代理服务器来进行网络访问&#xff0c;以避免访问过于频繁而受到网站服务器的限制。但是&#xff0c;代理服务器的IP地址也可能被目标网站限制&#xff0c;导致无法正常访问。这时候&#xff0c;我们需要在代理IP被封后…...

小程序开发——小程序项目的配置与生命周期

1.app.json配置属性 app.json配置属性 2.页面配置 app的页面配置指的是pages属性&#xff0c; pages数组的第一个页面将默认作为小程序的启动页。利用开发工具新建页面时&#xff0c;则pages属性对应的数组将自动添加该页面的路径&#xff0c;若是在硬盘中添加文件的形式则不…...

C语言之用指针交换两个数

1.指针存放是是地址&#xff0c;所以在用指针交换两个数的时候&#xff0c;需要对指针进行解引用(*p)。 用指针交换两个数&#xff0c;需要知道p1p2与*p1*p2。 p1p1是将p2的值赋值给p1. *p1*p2是将p2指针地址存放的值&#xff0c;赋值给p1指针地址存放的值&#xff0c;即p1地…...

Day 48 动态规划 part14

Day 48 动态规划 part14 解题理解1143103553 3道题目 1143. 最长公共子序列 1035. 不相交的线 53. 最大子数组和 解题理解 1143 设dp[i][j]为text10: i-1text20: j-1的最长公共子序列。 class Solution:def longestCommonSubsequence(self, text1: str, text2: str) -> …...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

Java多线程实现之Callable接口深度解析

Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习

禁止商业或二改转载&#xff0c;仅供自学使用&#xff0c;侵权必究&#xff0c;如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...