C++ Set

news2024/11/17 21:50:59

定义

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 90
  myset.insert(i*10);
  itlow=myset.lower_bound (30);                //       ^
  itup=myset.upper_bound (60);                 //                   ^

  myset.erase(itlow,itup);    // 10 20 70 80 90
    
  cout << "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 50

 pair<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的个数:

数组:111144

 int ret=myset.count(1);
 cout<<ret<<endl;


输出:4

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

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

相关文章

机泵设备如何通过设备健康管理平台实施预测性维护

机泵设备在工业生产中起着至关重要的作用&#xff0c;但长时间运行和频繁使用容易引发各种故障。为了提高机泵设备的可靠性和效率&#xff0c;预测性维护成为一种重要的管理策略。设备健康管理平台作为一种先进的工具&#xff0c;为机泵设备的预测性维护提供了有力支持。本文将…

第七届山东省黄炎培职业教育创新创业大赛圆满结束

山东省黄炎培职业教育创新创业大赛作为职教领域的一项品牌赛事&#xff0c;自举办以来&#xff0c;参赛院校覆盖面不断扩大&#xff0c;大赛水平和社会影响力不断提高&#xff0c;已成为全省职业教育领域的品牌赛事&#xff0c;是激发创新创业活力的重要抓手和有效载体&#xf…

UIAlertController 修改 title 或 message 样式相关

UIAlertController 文字换行后默认对齐方式为居中,若想调整其相关样式属性可以借鉴如下方式进行修改,具体实现方式 code 如下: NSString *msg "1、注销≠退出登录;\n注销:对不再使用的账号进行清空移除;注销后,App中数据将全部丢失,不可再找回;\n2、注销后,与账号相关的…

【Linux】配置JDKTomcat开发环境及MySQL安装和后端项目部署

目录 一、jdk安装配置 1. 传入资源 2. 解压 3. 配置 二、Tomcat安装 1. 解压开启 2. 开放端口 三、MySQL安装 1. 解压安装 2. 登入配置 四、后端部署 1. 数据库 2. 导入.war包 3. 修改端口 4.开启访问 一、jdk安装配置 打开虚拟机 Centos 登入账号&#xff…

控梦术(一)之什么是清明梦

控梦术 首先&#xff0c;问大家一个问题。在梦中&#xff0c;你知道自己是在做梦吗&#xff1f;科学数据表明&#xff0c;大约23%的人在过去一个月中&#xff0c;至少有一次在梦中意识到自己正在做梦。科学家把这叫做清醒梦或者叫做清明梦。科学家说&#xff0c;每个人都能学会…

【C++ 系列文章 -- 程序员考试 下午场 C++ 专题 201711 】

文章目录 1.1 C 题目六1.1.1 填空&#xff08;1&#xff09;详解1.1.2 填空&#xff08;2&#xff09;详解1.1.2.1 C this 的使用 1.1.3 填空&#xff08;3&#xff09;详解1.1.4 填空&#xff08;4&#xff09;详解1.1.5 填空&#xff08;5&#xff09;详解1.1.6 填空&#xf…

心理咨询预约小程序

随着微信小程序的日益普及&#xff0c;越来越多的人开始关注如何利用小程序来提供便捷的服务。对于心理咨询行业来说&#xff0c;搭建一个心理咨询预约小程序可以大大提高服务的效率和用户体验。本文以乔拓云平台为例&#xff0c;详细介绍如何轻松搭建一个心理咨询预约小程序。…

2023-简单点-yolox代码

yolox代码 yolox结构瞄一眼net代码常规convDWConv第一步第二步 CBA一套FocusSPPCSPDarknetFPNPANdecoupled predict headref yolox结构瞄一眼 net代码 #!/usr/bin/env python3 # -*- coding:utf-8 -*- # Copyright (c) Megvii, Inc. and its affiliates.import torch from tor…

JMeter如何开展性能测试

文章目录 性能测试指标理解透彻以及测算微聊性能测试性能测试流程准备流程 ​&#x1f451;作者主页&#xff1a;Java冰激凌 性能测试指标理解透彻以及测算 虚拟用户数&#xff1a; 线程 用户并发数&#xff1a;指在某一时间&#xff0c;一定数量的虚拟用户同时对系统的某个功…

k8s、pod

Pod k8s中的port【端口&#xff1a;30000-32767】 port &#xff1a;为Service 在 cluster IP 上暴露的端口 targetPort&#xff1a;对应容器映射在 pod 端口上 nodePort&#xff1a;可以通过k8s 集群外部使用 node IP node port 访问Service containerPort&#xff1a;容…

【C++】多态 ⑦ ( 多态机制实现原理 | 虚函数表概念 | 虚函数表工作机制 | vptr 指针 | 虚函数表运行时机制 | 虚函数与动态联编 )

文章目录 一、多态原理1、多态成立的三个条件2、虚函数表概念3、虚函数表工作机制4、vptr 指针5、虚函数表运行时机制6、虚函数与动态联编 二、代码示例 - 虚函数表1、代码实例分析 - 虚函数表创建与使用2、完整代码示例 一、多态原理 1、多态成立的三个条件 " 多态 "…

BoredHackerBlog: Cloud AV RT日记

目录 信息搜集 WEB漏洞攻击 拿shell 信息搜集 首先ifconfig查看自己IP&#xff0c; netdiscover查看同网段下主机 第三个应该是目标靶机。用nmap查看靶机开放端口&#xff1a; 开放22和8080&#xff0c;看看8080开的啥服务 WEB漏洞攻击 看到让我们输入邀请码。有输入框的第…

【原创】java+swing+mysql无偿献血管理系统设计与实现

摘要&#xff1a; 无偿献血管理系统是为了实现无偿献血规范化、有序化、高效化的管理而设计的。本文主要介绍使用java语言开发一个基于C/S架构的无偿献血管理系统&#xff0c;提高无偿献血管理的工作效率。 功能分析&#xff1a; 系统主要提供给管理员、无偿献血人员&#x…

C语言实现把两个升序数组合并成一个升序数组

完整代码&#xff1a; // 把两个升序数组合并成一个升序数组 #include<stdio.h> //单个数组的长度 #define N 5int main(){int arr1[N]{1,4,7,8,9};int arr2[N]{2,3,6,9,10};//创建合并后数组int arr3[2*N];//j为arr1的指针&#xff0c;k为arr2的指针int j0,k0;printf(&…

Emscripten + CMakeLists.txt 将 C++ 项目编译成 WebAssembly(.wasm)/js,并编译 Html 测试

背景&#xff1a;Web 端需要使用已有的 C 库&#xff08;使用 CMake 编译&#xff09;&#xff0c;需要将 C 项目编译成 WebAssembly(.wasm) 供 js 调用。 上篇文章《Mac 上安装 Emscripten》 已讲解如何安装配置 Emscripten 环境。 本篇文章主要讲解如何将基于 CMakeLists 配…

测试C#调用Aplayer播放视频(2:VideoPlayer源码学习)

参考文献1除了介绍Aplayer组件的用法之外&#xff0c;还提供有demo下载以供学习&#xff0c;本文学习并记录其中的使用方式。   VideoPlayer项目使用C#在VS2013开发&#xff0c;其解决方案中包括VideoPlayer和VideoPlayer两个小项目&#xff0c;前者基于.net framework4.0&am…

Linux:文件操作

目录 一、关于文件 1、文件类的系统接口 2、文件的含义 二、文件操作 1、C语言文件相关接口 2、系统接口 open close write read 三、文件描述符 关于fd fd的分配规则 输出重定向示例 输入重定向示例 追加重定向示例 dup2函数 缓冲区 stdout与stderr perror…

大促期间如何应对低价链接

一年一度的大促双十一即将来临&#xff0c;品牌商、经销商在忙着出货&#xff0c;消费者也在积极比价&#xff0c;大促最直观的感觉就是价格&#xff0c;没有低价的大促是没有意义的&#xff0c;所以品牌要管的不是低价产品&#xff0c;而是在不受规则下的低价行为。 力维网络有…

KnowledgeGPT:利用检索和存储访问知识库上增强大型语言模型10.30

利用检索和存储访问知识库上增强大型语言模型 摘要引言2 相关研究3方法3.1 任务定义3.2 知识检索3.2.1 代码实现3.2.2 实体链接3.2.3 获取实体信息3.2.4 查找实体或值3.2.5 查找关系 3.3 知识存储 4 实验 摘要 大型语言模型&#xff08;LLM&#xff09;在自然语言处理领域展现…

SpringBoot 集成 Camunda

SpringBoot 集成 Camunda 1 pom.xml2 application.yml3 SQL4 启动5 进入流程页面 1 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XML…