C++中STL-set详解

news2024/11/14 20:22:42

目录

 set/ multiset容器

1. set基本概念

2.set构造和赋值

3.set大小和交换

4.set插入和删除

5.set容器-查找和统计

6.set和multiset的区别

7.pair对组创建

8.set容器排序

9.set存放自定义数据类型


set/ multiset容器


1. set基本概念

简介:

所有元素都会在插入时自动被排序


本质:

set/multiset属于关联式容器,底层结构是用二叉树实现。


set和multiset区别:

 set不允许容器中有重复的元素. multiset允许容器中有重复的元素
 

2.set构造和赋值

代码

#include <iostream>
using namespace std;
#include <set>

void printSet(set<int>&s)
{
	for(set<int>::iterator it = s.begin();it != s.end();it++)
	{
		cout<<*it<<" ";
	}
	cout<<endl;
 } 
void test01()
{
	set<int>s1;
	//插入数据 只有insert方式 
	s1.insert(20);
	s1.insert(10);
	s1.insert(30);
	s1.insert(40);
	
	//遍历容器
	//set容器特:所有元素插入时自动排序
    //set容器不允许插入重复值 
	printSet(s1);
	
	//拷贝构造
	set<int>s2(s1) ;
	printSet(s2);
	
	//赋值
	set<int>s3;
	s3 = s2;
	printSet(s3);	 
 } 
 int main()
{
 	test01();
}

结果

3.set大小和交换

功能描述

统计set容器大小及交换set容器

函数原型

size();                                 //返回容器中元素数目

empty();                             //判断容器是否为空

swap();                              //交换俩个集合容器

代码 

#include <iostream>
using namespace std;
#include <set>

void printSet(set<int>&s)
{
	for(set<int>::iterator it = s.begin();it != s.end();it++)
	{
		cout<<*it<<" ";
	}
	cout<<endl;
 } 
void test01()
{
	set<int>s1;
	//插入数据 只有insert方式 
	s1.insert(20);
	s1.insert(10);
	s1.insert(30);
	s1.insert(40);
	
	//打印容器 
	printSet(s1);
	
	//判断是否为空
	if(s1.empty())
	{
	   cout<<"s1为空"<<endl; 
	} 
	else {
		cout<<"s1不为空"<<endl; 
		cout<<"s1的大小"<<s1.size() <<endl;
	}

 } 
 //交换
void test02()
{
 	set<int>s1;
 	
 	//插入数据
	s1.insert(10); 
	s1.insert(20); 
	s1.insert(30); 
	s1.insert(40); 
	
	set<int>s2;
 	
 	//插入数据
	s2.insert(100); 
	s2.insert(200); 
	s2.insert(300); 
	s2.insert(400);
	
	cout<<"交换前:"<<endl;
	printSet(s1);
	printSet(s2);
	
	s1.swap(s2);
	cout<<"交换后:"<<endl;

	printSet(s1);
	printSet(s2);
	 
} 
 int main()
{
 	test01();
 	test02();
}


结果

 

4.set插入和删除

功能描述

set容器进行插入数据和删除数据

函数原型

insert (elem);                //在容器中插入元素

clear ( );                       //清除所有元素

erase(pos);                  //删除pos迭代器所指的元素,返回下一个元素的迭代器

erase(beg,end);           //删除区间(beg,end)的所有元素,返回下一个元素的迭代器

erase(elem);              //删除容器中值为elem的元素

 代码

#include <iostream>
#include <set> 
using namespace std;

//set容器,插入和删除

void printSet(set<int>&s)
{
	for(set<int>::iterator it = s.begin();it != s.end();it++)
	{
		cout<<*it<<" ";
	}
	cout<<endl;
 } 
void test01()
{
	set<int>s1;
	
	//插入
	s1.insert(30);
	s1.insert(20);
	s1.insert(10);
	s1.insert(40);
	
	//遍历
	printSet(s1);
	
	//删除
	s1.erase(s1.begin());
	printSet(s1);
	
	//删除重载版本
	s1.erase(30);
	printSet(s1);
	
	//清空
//	s1.erase(s1.begin(),s1.end());
	s1.clear();
	printSet(s1); 
	 
}

int main()
{
	test01();
} 
 

结果

 

5.set容器-查找和统计

功能描述

对set容器进行查找数据以及统计数据

函数原型

find(key);      //查找key是否存在,若存在,返回该键的元素的迭代器;若不存在,返set.end();


count(key );   //统计key的元素个数

代码

#include <iostream>
#include <set> 
using namespace std;



void printSet(set<int>&s)
{
	for(set<int>::iterator it = s.begin();it != s.end();it++)
	{
		cout<<*it<<" ";
	}
	cout<<endl;
 } 
void test01()
{
	//查找 
	set<int>s1;
	
	//插入
	s1.insert(30);
	s1.insert(20);
	s1.insert(10);
	s1.insert(40);
	
	set<int>::iterator pos = s1.find(30);
	
	if(pos != s1.end() )
	{
		cout<< "找到元素:" << *pos <<endl; 
	} 
	else 
	{
		cout<< "未找到元素" <<endl; 
	}
	

	 
}

//统计
void test02()
{
	//查找
	set<int>s1;
	
	//插入数据
	s1.insert(10);
	s1.insert(20);
	s1.insert(30);
	s1.insert(40);
	
	int num = s1.count(30);
	cout<<"num = "<<num<<endl; 
} 
int main()
{
	test01();
	test02();
} 
 

结果

6.set和multiset的区别

学习目标
掌握set和multiset的区别


区别

set不可以插入重复数据,而multiset可以

set插入数据的同时会返回插入结果,表示插入是否成功.

multiset不会检测数据,因此可以插入重复数据


7.pair对组创建

功能描述
成对出现的数据,利用对组可以返回两个数据

两种创建方式

pair<type,type> p ( value1, value2 );


pair<type,type> p = make_pair( value1,value2 );

代码

#include <bits/stdc++.h>
using namespace std;

//pair对组创建
void test01()
{
	//第一种方式
	pair<string,int>p("Tom",20);
	
	cout<< "姓名:"<<p.first<<"年龄:"<<p.second << endl;
	
	//第二种方式
	pair<string,int>p2 = make_pair("Jerry",30);
	cout<< "姓名:"<<p2.first<<"年龄:"<<p2.second << endl;
	 
	 
} 
int main()
{
	test01();
} 

结果

 

8.set容器排序

学习目标

set容器默认排序规则为从小到大,掌握如何排序规则

主要技术特点

利用仿函数,可以改变排序规则

代码

#include <iostream>
#include <set>
using namespace std;

class MyCompare
{
  public:
  	bool operator()(int v1,int v2)
	  {
  		 return v1>v2;
	  }
};
// 容器排序
void test01()
{
	set<int>s1;
	
    s1.insert(30);
	s1.insert(20);
	s1.insert(10);
	s1.insert(40);
	s1.insert(50);
	
	for(set<int>::iterator it = s1.begin();it != s1.end();it++)
	{
		cout<<*it<<" ";
	}
	cout<<endl;
	
	//指定排序规则从大到小
	set<int,MyCompare>s2;
	s2.insert(30);
	s2.insert(20);
	s2.insert(10);
	s2.insert(40);
	s2.insert(50);
	
	for(set<int,MyCompare>::iterator it = s2.begin();it != s2.end();it++)
	{
		cout<<*it<<" ";
	}
	cout<<endl;
	
	 
} 
int main()
{
	test01();
} 

结果

 

9.set存放自定义数据类型

学习目标:
set容器默认排序规则为从小到大,掌握如何改变排序规则

主要技术点:
利用仿函数,可以改变排序规则

代码

#include <iostream>
#include <string>
#include <set>
using namespace std;

// set排序容器,存放自定义数据类型 
class Person
{
  public:
  	Person(string name,int age)
  	{
  		this->m_Name = name;
  		this->m_Age = age;
	}
	string m_Name;
	int m_Age;
};
class comparePerson 
{
  public:
  	bool operator()(const Person&p1,const Person&p2)
	  {
	  	 //按照年龄降序 
  		 return p1.m_Age > p2.m_Age; 
	  }
};
// 容器排序
void test01()
{
	//自定义数据要指定排序规则 
	set<Person,comparePerson>s;
	
	//创建Person对象
	Person p1("刘备",24);
	Person p2("关羽",28);
	Person p3("张飞",25);
	Person p4("赵云",21);
	
	s.insert(p1);
	s.insert(p2);
	s.insert(p3);
	s.insert(p4);
	
	for(set<Person,comparePerson >::iterator it = s.begin();it != s.end();it++)
	{
		cout<<"姓名:"<<it->m_Name << "年龄:"<<it->m_Age <<endl; 
	}
	cout<<endl;
	 
	 
}
int main()
{
	test01();
} 

结果


 

 

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

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

相关文章

使用Apisix打造家庭NAS网关,免公网IP访问

使用Apisix打造家庭NAS网关 本文使用apisix打造家庭NAS网关&#xff0c;并通过cloudflare进行穿透&#xff0c;可免公网IP访问。首先你的NAS支持Docker&#xff0c;没有NAS也没有关系&#xff0c;只要你的电脑支持Docker同样可以参照该教程。 1 依赖资源准备 准备域名: 免费…

HTML+CSS+JS做一个好看的个人网页—web网页设计作业

个人网页设计个人网页&#xff08;htmlcssjs&#xff09;——网页设计作业带背景音乐&#xff08;The way I still Love you&#xff09;、樱花飘落效果、粒子飘落效果页面美观&#xff0c;样式精美涉及&#xff08;htmlcssjs&#xff09;&#xff0c;下载后可以根据自己需求进…

8086,8088CPU管脚,奇偶地址体, 时钟信号发生器8284 ,ready信号,reset复位信号。规则字和非规则字

8086/8088均为40条引线&#xff0c;双列直插式封装&#xff0c;某些引线有多重功能&#xff0c;其功能转换有两种情况&#xff1a;一种是分时复用&#xff0c;一种是按组态定义。 用8088微处理器构成系统时&#xff0c;有两种不同的组态&#xff1a; 最小组态&#xff1a;808…

模型效果不好?推荐你8种机器学习调参技巧

大家好&#xff0c;今天给大家一篇关于机器学习调参技巧的文章 超参数调优是机器学习例程中的基本步骤之一。该方法也称为超参数优化&#xff0c;需要搜索超参数的最佳配置以实现最佳性能。 机器学习算法需要用户定义的输入来实现准确性和通用性之间的平衡。这个过程称为超参…

嵌入式开发学习之--RCC(上)

提示&#xff1a;本篇主要介绍一下不同时钟的特性和作用&#xff0c;了解为主。 文章目录前言一、RCC简介二、系统时钟简介2.1HSE 高速外部时钟信号2.2锁相环 PLL2.3系统时钟 SYSCLK2.4AHB 总线时钟 HCLK2.5 APB2 总线时钟 HCLK22.6 APB1 总线时钟 HCLK1三、其他时钟3.1RTC 时钟…

HTTP 请求是什么?

文章目录HTTP请求一&#xff0c;请求行二&#xff0c;请求头三&#xff0c;空行四&#xff0c;请求体五&#xff0c;HTTP请求示例HTTP请求 请求是由客户端向服务器发送的&#xff0c;一般可以分为请求行、请求头、空行和请求体四个部分&#xff0c;如下图所示&#xff1a; 一…

【数据集NO.2】工业检测数据集汇总(缺陷、纹理等检测)

文章目录前言一、东北大学钢材表面缺陷数据集二、天池铝型材表面缺陷数据集三、Severstal 带钢缺陷数据集四、UCI 带钢缺陷数据集五、磁瓦缺陷数据集六、RSDDs铁轨表面缺陷数据集七、印刷电路板&#xff08;PCB&#xff09;瑕疵数据集八、坑洼检测数据集九、Kylberg纹理检测十、…

C语言:文件操作(1)

1、什么是文件&#xff1f; 磁盘上的文件是文件。 但是在程序设计中&#xff0c;我们一般谈的文件有两种: 程序文件、数据文件 程序文件&#xff1a; 包括源程序文件(后缀为.c)&#xff0c;目标文件(windows环境后缀为.obj)&#xff0c;可执行程序(wndows环境后缀为.exe) 数…

初级测试到中级测试就差这几个找bug小技巧

前言 测试的过程就是一个寻找影响产品功能和用户体验bug的过程&#xff0c;测试人员发现的bug类型五花八门。 当你在上班期间&#xff0c;听到不远处传来这样的声音“你会不会提BUG&#xff0c;责任人都指派错了&#xff0c;还能好好提吗&#xff1f;” 如果哪天开发对着你说…

Babel自动生成Attribute文档实现详解

这篇文章主要为大家介绍了Babel自动生成Attribute文档实现示例详解&#xff0c;有需要的朋友可以借鉴参考下&#xff0c;希望能够有所帮助&#xff01; 1. 前言 利用Babel自动解析源码属性上的注释生成对应Markdown文档&#xff0c;这个场景的应用主要包括在组件库文档对组件…

SpringBoot单元测试

文章目录1、什么是单元测试2、单元测试有哪些好处&#xff1f;3、SpringBoot 单元测试使用3.1 生成单元测试的类3.2 配置单元测试的类并添加SpringBootTest注解3.3 添加单元测试的业务代码3.4 进行测试并查看结果3.5 使用断言3.6 在不修改数据库的前提下&#xff0c;执行单元测…

室内温度控制仿真模型(Simulink+PLC)

本篇博客将会和大家一起一步步解读Simulink自带的仿真模型(Thermal Model of a House),之后再讨论PLC控制系统控制环境温度的一些经验方法。温度控制的大部分控制方法都是采用PID控制,有关PLC的PID控制相关内容可以参看专栏的其它文章,链接如下: 博途PLC 1200/1500PID P…

【LeetCode每日一题:1774. 最接近目标价格的甜点成本~~~递归+深度优先遍历】

题目描述 你打算做甜点&#xff0c;现在需要购买配料。目前共有 n 种冰激凌基料和 m 种配料可供选购。而制作甜点需要遵循以下几条规则&#xff1a; 必须选择 一种 冰激凌基料。 可以添加 一种或多种 配料&#xff0c;也可以不添加任何配料。 每种类型的配料 最多两份 。 给你…

java计算机毕业设计ssm人事考勤管理系统1u133(附源码、数据库)

java计算机毕业设计ssm人事考勤管理系统1u133&#xff08;附源码、数据库&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff0…

Spread 16.X FOR WPF 中文版 我就喜欢 Spread.NET

Spread 16.X FOR WPF 中文版您可以将 Microsoft Excel 的强大功能嵌入到 WPF 和 Silverlight 应用中&#xff0c;使用丰富的内嵌数据可视化功能展现核心数据和分析结果&#xff0c;按需自定制富有创意的表格模版以及发挥更多便捷高效的功能。Spread WPF-Silverlight 源自备受好…

RIoTBoard开发板系列笔记(十三)—— yocto SDK安装与使用

yocto是一个很强大的嵌入式image 构建工具&#xff0c;借助yocto可以轻松的构建出一个开发板镜像。如果我们想借助yocto开发一些应用层的程序&#xff0c;有以下两种方法可供选择&#xff1a; &#xff08;1&#xff09;按照yocto的构建规则添加自己的程序和编译脚步&#xff0…

通话蓝牙耳机什么牌子好?通话工作蓝牙耳机推荐

在一般人的印象中&#xff0c;蓝牙耳机主要是用于听听歌、打打游戏还有煲剧&#xff0c;&#xff0c;而对经常经常外出的商务差旅人士和音乐发烧友来说&#xff0c;蓝牙耳机的通话和续航也是重点关注的&#xff0c;因此&#xff0c;笔者专门整理了一些通话效果好的蓝牙耳机&…

微服务框架 SpringCloud微服务架构 9 初识 Docker 9.3 Docker 架构

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构9 初识 Docker9.3 Docker 架构9.3.1 镜像和容器9.3.2 Docker 和DockerHub9…

【C/C++】C语言runtime调用技术

概述 C语言编译后&#xff0c;在可执行文件中会有 函数名信息。如果想要动态调用一个C函数&#xff0c;首先需要 根据函数名找到这个函数地址 &#xff0c;然后根据函数地址进行调用。 动态链接器已经提供一个 API&#xff1a;dlsym()&#xff0c;可以通过函数名字拿到函数地…

k8s中service资源与pod详解

文章目录一、Service1、创建集群内部可访问的Service2、创建集群外部也可访问的Service3、配置方式编写二、pod详解1、pod配置文件的资源列表2、pod配置3、启动命令4、port端口配置三、资源配额一、Service 通过上节课的学习&#xff0c;已经能够利用Deployment来创建一组Pod来…