C++ set类成员函数介绍 (set和multiset)

目录

🤔set模板介绍:

🤔特点:

🤔set的成员函数:

😊set构造函数:

🔍代码实例:

🔍运行结果:

😊 set赋值函数:

🔍代码实例:

🔍运行结果:

😊 set判断函数:

🔍代码实例

🔍运行结果:

 😊set的删除和插入:

🔍代码示例:

🔍运行结果:

​😊set存取函数:

🔍代码示例:

🔍运行结果:

         😊为何set不可以存取相同元素:

🔍代码实例:

🔍运行结果:

🤔multiset:

🤔特点

🔍代码实例:

🔍运行结果:

🔍原因:

🤔multiset与set的相似点与区别:

相似点:

不同点:

🤔结束!


🤔set模板介绍:

        📖C++中的set是一个集合容器,它存储唯一且已排序的元素。具体来说,set容器内部的元素总是按照一定的规则排好序的,而且这些元素必须是唯一的,即不允许存储重复的元素。set还支持快速查找、删除和插入元素。

        📖set容器底层一般采用红黑树实现,因此它的插入、删除、查找操作的时间复杂度均为O(log n)。此外,set容器还提供了很多有用的成员函数和迭代器,比如begin、end、find等,使得我们可以方便地对set进行遍历、查找、排序等操作。

        📖总之,C++的set容器是一种非常实用的数据结构,它可以帮助我们高效地存储和处理一组唯一的元素。

🤔特点:

📖1. 存储唯一元素:set容器内部的元素不允许重复,每个元素只会出现一次。这项特点使得set容器常用于需要存储一组唯一元素的场景,对于为何set不能存储重复元素,我们在下文会从c++的set的insert定义解释。

📖2. 内部元素已排序:set容器内部元素总是按照一定的规则排序的。默认情况下,set使用元素类型的<运算符来进行排序,也可以自定义比较函数。

📖3. 快速查找:set内部基于红黑树实现,使得元素的查找的平均时间复杂度始终为O(log n)

📖4. 快速插入和删除:由于内部采用红黑树,因此向set容器插入和删除元素的平均时间复杂度也为O(log n)

📖5. 提供迭代器:set提供迭代器,可以使用iterator、const_iterator、reverse_iterator、const_reverse_iterator四种迭代器进行遍历操作。

📖6. 支持自动排序和自定义排序:set默认使用<运算符来进行元素的排序,但也可以自定义比较函数来进行排序。

📖7. 可以快速查找区间:set提供了lower_bound()和upper_bound()两种函数,可以快速查找某个区间内的元素。

总的来说,set容器是一种非常实用的集合容器,可以帮助我们高效地进行元素集合的存储、遍历和查找等操作。

🤔set的成员函数:

😊set构造函数:

📖1.默认构造函数:set<T> st;

set<int>d1;

📖2.拷贝构造函数:set(const set &st);

set<int>d2(d1);
printfset(d2);

🔍代码实例:

#include<set>
#include<iostream>
using namespace std;
void printfset(set<int>& s)
{
	for (set<int>::iterator it = s.begin(); it != s.end(); it++)
	{
		cout << *it << "  ";
	}
	cout << endl;

}
void test01()
{
	//默认构造:
	set<int>d1;
	d1.insert(24);
	d1.insert(24);
	d1.insert(243);
	d1.insert(73);
	d1.insert(63);
	cout << "默认构造结果为:";
	printfset(d1);

	//拷贝函数
	set<int>d2(d1);
	cout << "拷贝构造结果为:";
	printfset(d2);


}
int main()
{
	test01();
}

🔍运行结果:

😊 set赋值函数:

📖1.重载等号运算符:set &operator  =(const  set &st)

set<int>d3=d1;

🔍代码实例:

#include<set>
#include<iostream>
using namespace std;
void printfset(set<int>& s)
{
	for (set<int>::iterator it = s.begin(); it != s.end(); it++)
	{
		cout << *it << "  ";
	}
	cout << endl;

}
void test01()
{
	//默认构造:
	set<int>d1;
	d1.insert(24);
	d1.insert(24);
	d1.insert(243);
	d1.insert(73);
	d1.insert(63);
	cout << "默认构造结果为:";
	printfset(d1);



	//重载等号运算符
	set<int>d3=d1;
	cout << "重载等号运算符结果为:";
	printfset(d3);
}
int main()
{
	test01();
}

🔍运行结果:

😊 set判断函数:

📖1.返回容器中的元素数目:    size();

📖2.判断容器是否为空:           empty();

📖3.交换两个容器:                   swap();

🔍代码实例

#include<set>
#include<iostream>
using namespace std;
void printfset(set<int>& s)
{
	for (set<int>::iterator it = s.begin(); it != s.end(); it++)
	{
		cout << *it << "  ";
	}
	cout << endl;

}
void test01()
{
	//默认构造:
	set<int>d1;
	d1.insert(24);
	d1.insert(24);
	d1.insert(243);
	d1.insert(73);
	d1.insert(63);
	printfset(d1);

	cout << "容器是否为空(0不为空,1为空)" << d1.empty()<<endl;
	cout << "容器中的元素个数" << d1.size()<<endl;

	set<int>d2;
	d2.swap(d1);
	printfset(d2);
}
int main()
{
	test01();
}

🔍运行结果:

 😊set的删除和插入:

📖1.对set容器进行删除和插入
 
📖1.在容器中插入元素: insert(elem)
 
📖2.清除所有元素:   clear();
 
📖3.删除pos所指元素,返回下一个元素的迭代器  earse();
 
📖4删除区间[beg,end)的所有元素,返回下一个元素的迭代器.   erase(beg,end)  
 
📖5.删除指定元素         earse(elem)

🔍代码示例:

#include<set>
#include<iostream>
using namespace std;
void printfset(set<int>& s)
{
	for (set<int>::iterator it = s.begin(); it != s.end(); it++)
	{
		cout << *it << "  ";
	}
	cout << endl;

}
void test01()
{
	//默认构造:
	set<int>d1;
	d1.insert(24);
	d1.insert(24);
	d1.insert(243);
	d1.insert(73);
	d1.insert(63);
	printfset(d1);

	d1.insert(100);
	cout << "插入元素之后:" << endl;
	printfset(d1);

	d1.erase(100);
	cout << "删除指定元素后" << endl;
	printfset(d1);


	d1.erase(d1.begin());
	cout << "删除指定头位置元素后" << endl;
	printfset(d1);


	d1.erase(d1.begin(),d1.end());
	cout << "删除指定区间元素后" << endl;
	printfset(d1);
	
	cout << "重新赋值后结果为:";
	d1.insert(24);
	d1.insert(24);
	d1.insert(243);
	d1.insert(73);
	d1.insert(63);
	printfset(d1);

	d1.clear();
	cout << "清空容器后结果为:";
	printfset(d1);
}
int main()
{
	test01();
}

🔍运行结果:


😊set存取函数:

📖1.查找元素是否存在,如果存在,返回该元素的迭代器,如果不存在返回end() :        find()
📖2.统计key的元素个数:     count(key)    

📖*由于set不会重复存取相同元素,所以查找已存在的数字的出现个数一定是1.

🔍代码示例:

#include<set>
#include<iostream>
using namespace std;
void printfset(set<int>& s)
{
	for (set<int>::iterator it = s.begin(); it != s.end(); it++)
	{
		cout << *it << "  ";
	}
	cout << endl;

}
void test01()
{
	//默认构造:
	set<int>d1;
	d1.insert(24);
	d1.insert(24);
	d1.insert(243);
	d1.insert(73);
	d1.insert(63);
	printfset(d1);

	set<int>::iterator pos = d1.find(73);

	cout << *pos<<endl;

	cout<<"24元素的个数为"<<d1.count(24);

}
int main()
{
	test01();
}

🔍运行结果:

😊为何set不可以存取相同元素:

📖我们查看插入insert的定义:

  template <bool _Multi2 = _Multi, enable_if_t<!_Multi2, int> = 0>
    pair<iterator, bool> insert(value_type&& _Val) {
        const auto _Result = _Emplace(_STD move(_Val));
        return {iterator(_Result.first, _Get_scary()), _Result.second};
    }

 📖我们可以发现insert一共返回两个值,一个是指向这个元素的迭代器,一个是bool类型的数据,而这个bool类型的数据就是由于set会对插入数据进行检测而生成的。bool返回是否插入成功。也就是说set的插入数据,会对数据进行一次判断,这里的判断就是在判断是否插入存在元素。

🔍代码实例:

📖在这里我们连续两次插入元素24,并接收返回结果:

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

void test01()
{
	//默认构造:
	set<int>d1;
	pair<set<int>::iterator,bool>ret= d1.insert(24);
	cout << "第一次:";
		if (ret.second)
		{
			cout << "插入成功"<<endl;
		}
		else
		{
			cout << "插入失败" << endl;
		}
		pair<set<int>::iterator, bool>reat = d1.insert(24);
	cout << "第二次:";
		if (reat.second)
		{
			cout << "插入成功" << endl;
		}
		else
		{
			cout << "插入失败" << endl;
		}

		multiset<int>d2;
		d2.insert(0);
}
int main()
{
	test01();
}

🔍运行结果:

📖而有的时候我们需要插入重复的元素,我们又定义了一个容器:

🤔multiset:

📖与set容器类似,multiset容器也是STL中的关联容器之一。不同的是,multiset容器允许元素重复出现。

📖具体的,multiset容器中的元素是按照一定顺序进行排列的,每个元素可以出现多次。在访问multiset容器中的元素时,我们无法直接改变元素的值,因为multiset容器中元素的值实际上是一个常量,否则会影响到容器的排序特性。

🤔特点

  1. 允许元素重复:与set容器不同,multiset容器中相同的元素可以出现多次。

  2. 内部元素已排序:multiset容器内部元素总是按照一定的规则排序的。默认情况下,multiset使用元素类型的<运算符来进行排序,也可以自定义比较函数。

  3. 快速查找:multiset内部基于红黑树实现,使得元素的查找的平均时间复杂度始终为O(log n)。

  4. 快速插入和删除:由于内部采用红黑树,因此向multiset容器插入和删除元素的平均时间复杂度也为O(log n)。

  5. 提供迭代器:multiset提供迭代器,可以使用iterator、const_iterator、reverse_iterator、const_reverse_iterator四种迭代器进行遍历操作。

  6. 支持自动排序和自定义排序:multiset默认使用<运算符来进行元素的排序,但也可以自定义比较函数来进行排序。

  7. 可以快速查找区间:multiset提供了lower_bound()和upper_bound()两种函数,可以快速查找某个区间内的元素。

        📖与set容器一样,multiset容器也是一种非常实用的集合容器,可以帮助我们高效地进行元素集合的存储、遍历和查找等操作。

       📖 multiset与set调用同一个头文件,二者的成员函数基本相同,调用方式也一样,我们在本文不做赘述,唯一需要注意的就是multiset可以存储重复的元素。

🔍代码实例:

#include<set>
#include<iostream>
using namespace std;
void printfset(multiset<int>& s)
{
	for (auto  it = s.begin(); it != s.end(); it++)
	{
		cout << *it << "  ";
	}
	cout << endl;

}
void test01()
{
	//默认构造:

	multiset<int>d1;


	d1.insert(24);
	d1.insert(24);
	d1.insert(243);
	d1.insert(73);
	d1.insert(63);
	printfset(d1);
	
	
}
int main()
{
	test01();
}

🔍运行结果:

🔍原因:

我们再查看multiset的insert定义:

 template <bool _Multi2 = _Multi, enable_if_t<_Multi2, int> = 0>
 iterator insert(value_type&& _Val) {
 return iterator(_Emplace(_STD move(_Val)).first, _Get_scary());

我们可以发现它只返回指向插入元素的迭代器,并不会对插入元素进行检测

🤔multiset与set的相似点与区别:

相似点:

1. 两种容器内部元素默认都是按照升序排列的。

2. 都不支持随机访问,元素只能通过迭代器依次访问。

3. 由于内部实现采用了二叉搜索树(红黑树),在元素查找上具有较高的效率。

不同点:

1. multiset容器允许出现重复的元素,而set容器中不允许出现重复元素。换句话说,set容器中的元素是唯一的。

2. 在插入元素时,set容器会检查元素是否存在,如果相同则插入无效,而multiset容器插入元素时则不会检查元素是否已经存在,可以插入重复元素。

3. 在删除元素时,set容器只会删除指定值的第一个元素,而multiset容器则会删除所有符合条件的元素。

📖综上所述,multiset容器比set容器多了允许相同元素的功能,并提供了equal_range函数,删除元素时也不会在删除第一个值后停止。针对不同的问题,可以选择不同的容器。

🤔结束!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux——线程的同步与互斥

目录 模拟抢火车票的过程 代码示例 thread.cc Thread.hpp 运行结果 分析原因 tickets减到-2的本质 解决抢票出错的方案 临界资源的概念 原子性的概念 加锁 定义 初始化 销毁 代码形式如下 代码示例1&#xff1a; 代码示例2&#xff1a; 总结 如何看待锁 申…

【C++】STL中stack的用法及模拟实现

目录 一、stack的简介二、stack的使用三、stack的模拟实现 一、stack的简介 stack是一种容器适配器&#xff0c;专门用在后进先出操作的上下文中环境中&#xff0c;其中的元素只允许从容器固定的一端进行插入和删除操作。stack是作为容器适配器来实现的&#xff0c;容器适配器…

信息安全实践1.3(HTTPS)

前言 做这个实验对Tomcat的版本有要求&#xff0c;最好是使用Tomcat8。因为我之前使用Tomcat10&#xff0c;然后一直做不出来。 要求 部署Web服务器端HTTPS功能&#xff0c;通过网络嗅探分析HTTPS通过SSL实施安全保护的效果 关键步骤 首先要给tomcat配置https&#xff0c;也…

Unity3D安装:离线安装 Unity

推荐&#xff1a;将 NSDT场景编辑器 加入你的3D工具链 3D工具集&#xff1a; NSDT简石数字孪生 在没有 Hub 的情况下离线安装 Unity Unity 下载助手 (Download Assistant) 支持离线部署。在这种部署方式中&#xff0c;可下载用于安装 Unity 的所有文件&#xff0c;然后生成脚本…

采购申请审批测试

采购申请审批的配置并不难&#xff0c;但是总会有原因导致业务无审批策略&#xff0c;而且这个配置也比较脆弱&#xff0c;有时同步也会出现问题&#xff0c;小编利用这篇操作记录下测试结果。 1、项目类别的审批策略分类 下图是审批策略分类-项目类别不给值&#xff0c;测试…

(浙大陈越版)数据结构 第三章 树(上) 3.4 小白专场:树的同构(PTA编程题讲解)

题意理解和二叉树表示 给定两棵树T1和T2。如果T1可以通过若干次左右孩子互换变成T2&#xff0c;则称两棵树是“同构”的。 eg1&#xff1a;现请你判断如下两棵树&#xff08;左侧为T1&#xff0c;右侧为T2&#xff09;是否为同构树&#xff1f; 显然T1可以通过有限次左右孩子…

如何利用IDEA将Git分支代码回退到指定历史版本

一、背景 作为一名后端开发&#xff0c;相信大家一定遇到过这样的情景&#xff0c;代码开发人员过多&#xff0c;并且开发分支过多&#xff0c;导致代码版本管理困难&#xff0c;这样就难免遇到一些代码合并出错&#xff0c;比如&#xff0c;当我提交了本次修改到本地和远程分…

jsp页面调试

现象: 访问jsp页面, 页面为空, 网络请求显示失败, 控制台打印错误net::ERR_INCOMPLETE_CHUNKED_ENCODING 200 分析: 错误描述&#xff1a;编码模块不完整&#xff0c;返回浏览器的流不完整 可能得原因: 1、网络是否稳定 2、服务器端是否有对响应数据做限制&#xff0c;比如…

photoshop矫正扫描图片的倾斜问题以及修改图片内容

由于工程原因&#xff0c;资料需要重新梳理 1.扫描工程表格到电脑中 2.在ps中导入表格内容&#xff08;表格有时候是倾斜的&#xff09; 需要修正为正常状态&#xff0c;即垂直状态 设置步骤&#xff1a; 1.调整ps的背景颜色与所在图片的背景颜色一致 用吸管工具&#xff…

【thingsboard+NodeRed+chirpstack】实现Lora节点设备的数据上下行通讯

本文主要实现基于 thingsboard+NodeRed+chirpstack 实现 lora设备的数据上下行通讯。 NodeRed作为mqtt桥接器,在开源的社区版 thingsboard上实现 这里写目录标题 LoRa 设备上下行通讯方案数据上行数据下行Device 层面创建设备时,要添加 relation规则链层面灯控模块规则链规则…

Sentinel降级规则

1.降级规则简介 官方文档 熔断降级概述 除了流量控制以外&#xff0c;对调用链路中不稳定的资源进行熔断降级也是保障高可用的重要措施之一。一个服务常常会调用别的模块&#xff0c;可能是另外的一个远程服务、数据库&#xff0c;或者第三方 API 等。例如&#xff0c;支付的…

华为OD机试之处理器问题(Java源码)

处理器问题 题目描述 某公司研发了一款高性能AI处理器。每台物理设备具备8颗AI处理器&#xff0c;编号分别为0、1、2、3、4、5、6、7。 编号0-3的处理器处于同一个链路中&#xff0c;编号4-7的处理器处于另外一个链路中&#xff0c;不通链路中的处理器不能通信。 如下图所示。…

基于html+css的图展示97

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

安装Arch Linux后要做的十件事

Arch Linux 是一款轻量级、灵活且高度可定制的Linux发行版&#xff0c;被广泛用于个人电脑和服务器。一旦您成功安装了Arch Linux&#xff0c;接下来有一些重要的任务需要完成&#xff0c;以确保系统的稳定性和安全性&#xff0c;并为您的需求做好准备。 本文将详细介绍安装Ar…

【Android】配置不同的开发和生产环境

目录 前言 配置build.gradle&#xff08;Module级别&#xff09; 创建对应环境的目录 切换不同环境 ​编辑选择打包的环境 前言 在web开发中不同的环境对应的配置不一样&#xff0c;比如开发环境的url是这样&#xff0c;测试环境的url是那样的&#xff0c;在app中也会涉…

jdk15至17——sealed密封关键字

sealed关键字是从jdk15开始预览&#xff0c;直到jdk17成为正式版&#xff0c;可以对继承父类和实现接口进行更加细粒度的限制&#xff0c;之前的限制也只有final用于禁止继承&#xff0c;默认包权限限制在同一个包内&#xff0c;sealed密封类/接口可以明确指定哪些类可以进行继…

通过Python的PIL库给图片添加马赛克

文章目录 前言一、Pillow是什么&#xff1f;二、安装PIL库三、查看PIL库版本四、使用方法1.引入库2.定义图片路径3.打开需要打马赛克的图片4.获取图片尺寸5.创建一个新的图片对象6.定义块的宽高7.循环遍历图片中的每个块进行处理8.保存马赛克图片9.效果 总结 前言 大家好&#…

客服配置-shopro

客服配置 注意事项 shopro客服系统 采用 workerman 的 gateway-worker 作为服务基础&#xff0c;请先安装 gateway-worker 扩展包shopro商城 已不再支持 workerman 在线客服插件 安装部署 安装扩展包 composer require workerman/gateway-worker:~3.0 删除禁用函数(如有未列…

C Primer Plus第十二章编程练习答案

学完C语言之后&#xff0c;我就去阅读《C Primer Plus》这本经典的C语言书籍&#xff0c;对每一章的编程练习题都做了相关的解答&#xff0c;仅仅代表着我个人的解答思路&#xff0c;如有错误&#xff0c;请各位大佬帮忙点出&#xff01; 1.不使用全局变量&#xff0c;重写程序…

idea使用Alibaba Cloud Toolkit插件远程操作Docker

idea使用Alibaba Cloud Toolkit插件远程操作Docker 文章目录 前言一、tcp://IP:2375或者Unix socket 连接Docker(不安全)问题1&#xff1a;为什么本地虚拟机能连上&#xff0c;xxx云ECS服务器连不上&#xff1f;问题2&#xff1a;什么是Unix域套接字&#xff1f;有什么作用&…