C++基础STL-set容器

news2025/1/19 19:30:24

set容器介绍:

        set译为集合,集合是按照特定顺序存储唯一元素的容器。在集合中,元素的值也标识它(值本身就是键,类型为T),并且每个值必须是唯一的。集合中元素的值在容器中一次就不能修改(元素总是const),但可以从容器中插入或删除它们。

set/multiset容器基本概念

所有元素都会根据元素的键值自动被排序。

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

set容器特点

set的元素不像map那样可以同时拥有实值和键值,set的元素即是键值又是实值。 set不允许两个元素有相同的键值。 不能通过set的迭代器改变set元素的值。因为set元素值就是其键值,关系到set元素的排序规则。如果任意改变set元素值,会严重破坏set组织。 set容器的迭代器为可读迭代器。

目录

set构造和赋值

set大小和交换

set插入和删除

set查找和统计

set和multiset区别

pair对组创建

set容器排序

总结:

set构造和赋值

构造:

set<T> st;                //默认构造函数:
set(const set &st);       //拷贝构造函数

赋值:

set& operator=(const set &st);    //重载等号操作符

示例:

#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;

	s1.insert(10);
	s1.insert(30);
	s1.insert(20);
	s1.insert(40);
	printSet(s1);

	//拷贝构造
	set<int>s2(s1);
	printSet(s2);

	//赋值
	set<int>s3;
	s3 = s2;
	printSet(s3);
}

int main() {

	test01();

	system("pause");

	return 0;
}

运行结果:

set大小和交换

size();        //返回容器中元素的数目
empty();       //判断容器是否为空
swap(st);      //交换两个集合容器

示例主要代码:

//大小
void test01()
{

	set<int> s1;

	s1.insert(10);
	s1.insert(30);
	s1.insert(20);
	s1.insert(40);

	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(30);
	s1.insert(20);
	s1.insert(40);

	set<int> s2;

	s2.insert(100);
	s2.insert(300);
	s2.insert(200);
	s2.insert(400);

	cout << "交换前" << endl;
	printSet(s1);
	printSet(s2);
	cout << endl;

	cout << "交换后" << endl;
	s1.swap(s2);
	printSet(s1);
	printSet(s2);
}

运行结果:

set插入和删除

insert(elem);       //在容器中插入元素。
clear();            //清除所有元素
erase(pos);         //删除pos迭代器所指的元素,返回下一个元素的迭代器。
erase(beg, end);    //删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。
erase(elem);        //删除容器中值为elem的元素。

示例主要代码:

//插入和删除
void test01()
{
	set<int> s1;
	//插入
	s1.insert(10);
	s1.insert(30);
	s1.insert(20);
	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);
}

运行结果:

set查找和统计

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

示例主要代码:

void test01()
{
	set<int> s1;
	//插入
	s1.insert(10);
	s1.insert(30);
	s1.insert(20);
	s1.insert(40);

	//查找
	set<int>::iterator pos = s1.find(30);

	if (pos != s1.end())
	{
		cout << "找到了元素 : " << *pos << endl;
	}
	else
	{
		cout << "未找到元素" << endl;
	}

	//统计
	int num = s1.count(30);
	cout << "num = " << num << endl;
}

运行结果:

set和multiset区别

         set不可以插入重复数据,而multiset可以
         set插入数据的同时会返回插入结果,表示插入是否成功
         multiset不会检测数据,因此可以插入重复数据

示例主要代码:

//set和multiset区别
void test01()
{
	set<int> s;
	pair<set<int>::iterator, bool>  ret = s.insert(10);
	if (ret.second) {
		cout << "第一次插入成功!" << endl;
	}
	else {
		cout << "第一次插入失败!" << endl;
	}

	ret = s.insert(10);
	if (ret.second) {
		cout << "第二次插入成功!" << endl;
	}
	else {
		cout << "第二次插入失败!" << endl;
	}

	//multiset
	multiset<int> ms;
	ms.insert(10);
	ms.insert(10);

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

运行结果:

pair对组创建

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

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

示例主要代码:

//对组创建
void test01()
{
	pair<string, int> p(string("Tom"), 20);
	cout << "姓名: " << p.first << " 年龄: " << p.second << endl;

	pair<string, int> p2 = make_pair("Jerry", 10);
	cout << "姓名: " << p2.first << " 年龄: " << p2.second << endl;
}

运行结果:

set容器排序

        set容器默认排序规则为从小到大,利用仿函数,可以改变排序规则

set存放内置数据类型时:

示例:

#include<iostream>
using namespace std;
#include<set>
class MyCompare
{
public:
	bool operator()(int v1, int v2)const {
		return v1 > v2;
	}
};
void test01()
{
	set<int> s1;
	s1.insert(10);
	s1.insert(40);
	s1.insert(20);
	s1.insert(30);
	s1.insert(50);

	//默认从小到大
	for (set<int>::iterator it = s1.begin(); it != s1.end(); it++) {
		cout << *it << " ";
	}
	cout << endl;

	//指定排序规则
	set<int, MyCompare> s2;
	s2.insert(10);
	s2.insert(40);
	s2.insert(20);
	s2.insert(30);
	s2.insert(50);

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


int main() {

	test01();

	system("pause");

	return 0;
}

运行结果:

 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)const
	{
		//按照年龄进行排序  降序
		return p1.m_Age > p2.m_Age;
	}
};

void test01()
{
	set<Person, comparePerson> s;

	Person p1("小明", 23);
	Person p2("小李", 27);
	Person p3("小张", 33);
	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;
	}
}

运行结果:

总结:

        Set容器的有序性和唯一性特性极大地减少了大量重复和排序等工作,在很多场景下Set容器更具优势,下列情况是使用Set容器合适的情况:

  1. 存储元素类型不能够重复的场景,比如存储用户的唯一ID
  2. 操作多个对象时,必须使用排序算法的场景
  3. 需要快速查找插入元素的场景

        通过Set容器,可以快速获取唯一和有序的结果,同时在大数据量下性能也相对较高,因此使用场景广泛。

        类似地,STL标准库中还提供有 map和 multimap这 2 个容器,它们也属于关联式容器。大家可以将他们对比联系学习。

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

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

相关文章

python学习环境准备

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言本专栏文章旨在记录《Python编程从入门到实践》一书的学习笔记。 一、编程环境二、使用步骤1.修改默认python版本2.终端退出python解释器3.编写.py文件4.运行.p…

【Linux是如何发送网络包的?】

网络模型 为了使得多种设备能通过网络相互通信&#xff0c;和为了解决各种不同设备在网络互联中的兼容性问题&#xff0c;国际标准化组织制定了开放式系统互联通信参考模型&#xff08;Open System Interconnection Reference Model&#xff09;&#xff0c;也就是 OSI 网络模…

【工作中掌握10个就够了!!!】Linux中的10个最常见命令+vim三个基本操作

欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#xff1a;重难点★✔ 蓝色文字表示&#…

【macOS自带VNC远程】——Windows在外远程桌面控制macOS

文章目录 前言1.测试局域网内远程控制1.1 macOS打开屏幕共享1.2 测试局域网内VNC远程控制 2. 测试公网远程控制2.1 macOS安装配置cpolar内网穿透2.2 创建tcp隧道&#xff0c;指向5900端口 3. 测试公网远程控制4. 配置公网固定TCP地址4.1 保留固定TCP地址4.2 配置固定TCP端口地址…

Java | 一分钟掌握定时任务 | 4 - 多线程的Timer

作者&#xff1a;Mars酱 声明&#xff1a;本文章由Mars酱原创&#xff0c;部分内容来源于网络&#xff0c;如有疑问请联系本人。 转载&#xff1a;欢迎转载&#xff0c;转载前先请联系我&#xff01; 前言 JDK自带的Timer是无法做到多任务并发的&#xff0c;那么我们怎么处理多…

如何编写一份优质软件测试工程师简历的范文【建议收臧】

很多刚转行软件测试的小伙伴是不是不知道怎么写好一份优质的软件测试工程师的简历。今天呢&#xff0c;就给大家分享一下一个优质软件测试工程师简历的范文。记得收藏起来哦。 下面的案例&#xff1a;2-3年的软件测试工程的简历 姓 名&#xff1a;XXX 学历&#xff1a…

Zabbix“专家坐诊”第191期问答汇总

问题一 Q&#xff1a;snmp监控服务器风扇、温度等硬件信息需要要mib库吗&#xff1f; A&#xff1a;官网有相关的mib库可查&#xff0c;一般同大型号通用&#xff0c;直接去官方下就行。 问题二 Q&#xff1a;zabbix用的postgresqltimescaledb备份这个数据库的时候不想包含历…

【Linux】-Linux的权限

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树 ❤️‍&#x1fa79;作者宣言&#xff1a;认真写好每一篇博客 &#x1f4a8;作者gitee:gitee &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 如 果 你 喜 欢 作 者 的 文 章 &#xff0c;就 给 作 者 点 …

【C++】入门必备小知识

C入门 1. 域2. 命名空间2.1命名空间的定义2.2 命名空间的使用 3. C输入和输出4. 缺省参数5. 函数重载6. 引用7. auto8. 范围for9.nullptr空指针10.内联函数 1. 域 域就是作用域&#xff0c;同一个域不可以用同名的变量&#xff0c;不同域可以用同名变量&#xff0c;遵循局部优…

案例11:Java超市管理系统设计与实现开题报告

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

5年时间里,自动化测试于我带来的意义,希望你也能早点知道

摘要&#xff1a;在我有限的软件测试经历里&#xff0c;曾有一段专职的自动化测试经历。 接触自动化 那时第一次上手自动化测试&#xff0c;团队里用的是Python&#xff0c;接口自动化测试的框架是requestsExcelJenkins&#xff0c;APP自动化测试的框架是Appium。 整个公司当…

寻找差值结构的最优顺序

( A, B )---3*30*2---( 1, 0 )( 0, 1 ) 让网络的输入只有3个节点&#xff0c;AB训练集各由6张二值化的图片组成&#xff0c;让A中有6个1 差值结构的每行只能是二进制的3&#xff0c;6&#xff0c;5..3列每列1的数量为1&#xff0c;2&#xff0c;3.B中全是0&#xff0c;排列组合…

“记录新时代 奋进新征程”省市主流媒体共赴省交通集团在建项目采风

近日&#xff0c;浙江省省市13家主流媒体集中走进杭绍甬高速杭绍段绍兴侧路面施工现场、杭金衢高速联络线PPP项目中村大桥及杨家山隧道等施工现场&#xff0c;近距离感受在建工程的标准化施工、数字化赋能以及产业工人队伍打造。 标准化、数字化齐头并进&#xff0c;保障路面施…

脂溶性荧光染料Cy7标记羧酸Cy7-COOH/Carboxylic acids星戈瑞

CY7-COOH是一种含有羧基的化合物&#xff0c;它的分子式为C37H45ClN2O2&#xff0c;分子量519.12。其化学结构中包含有一个吲哚菁骨架&#xff0c;以及一个羧基&#xff08;COOH&#xff09;官能团。它的分子式为C37H45ClN2O2&#xff0c;分子量519.12。CY7-COOH是一种近红外荧…

热烈祝贺百华鞋业通过山东省专精特新企业认定!

近日&#xff0c;山东省工业和信息化厅公布了山东省2023年度专精特新中小企业名单&#xff0c;百华鞋业荣誉上榜&#xff01; 专精特新中小企业是指具有“专业化、精细化、特色化、新颖化”特征的中小企业&#xff0c;多专注于产业链上某个环节&#xff0c;主营业务聚焦&#…

Three.js--》实现3d小岛模型搭建

目录 项目搭建 初始化three.js基础代码 设置环境背景 设置水面样式 添加天空小岛 今天简单实现一个three.js的小Demo&#xff0c;加强自己对three知识的掌握与学习&#xff0c;只有在项目中才能灵活将所学知识运用起来&#xff0c;话不多说直接开始。 项目搭建 本案例还…

AR和VR技术的进展和应用:如何为移动应用开发添加更多趣味和体验?

章节一&#xff1a;引言 作为一名移动应用开发者&#xff0c;我一直致力于为用户提供创新和令人兴奋的体验。随着技术的不断发展&#xff0c;AR和VR技术成为了实现这一目标的有力工具。无论是增强现实还是虚拟现实&#xff0c;它们都能够将虚拟世界与现实世界相结合&#xff0…

可移动磁盘“未格式化”提示?教程帮你重获数据!

可移动磁盘在使用的过程中会出现各种奇怪的错误&#xff0c;比如小编今天碰到的一个&#xff0c;打开分区提示未格式化&#xff01;可移动磁盘“未格式化”提示&#xff1f;教程帮你重获数据&#xff01; 可移动磁盘“未格式化”提示&#xff1f;教程帮你重获数据&#xff01; …

【新星计划·2023】常用的5种VLAN的划分方式,你知道几种?

在说VLAN划分方式之前&#xff0c;先来说一说什么是VLAN&#xff1f;为什么需要划分VLAN&#xff1f; 一、什么是VLAN VLAN(Virtual Local Area Network)即虚拟局域网&#xff0c;是将一个物理的LAN在逻辑上划分成多个广播域的通信技术。每个VLAN是一个广播域&#xff0c;VLA…

我还是劝你别去外包,干了4年,废了.....

先说一下自己的情况&#xff0c;大专生&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…