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

news2024/11/20 20:25:35

目录

🤔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函数,删除元素时也不会在删除第一个值后停止。针对不同的问题,可以选择不同的容器。

🤔结束!

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

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

相关文章

IMX6ULL裸机篇之I2C相关寄存器

一. I2C实验 I2C时钟选择与传输速率 1. IMX6ULL的 I2C频率标准模式 100kbit/S&#xff0c;快速模式为 400Kbit/S 2. 时钟源选择 perclk_clk_rootipg_clk_root66MHz&#xff08;由之前的时钟实验章节可以知道是 66MHz&#xff09;。 二. I2C 寄存器配置 I2Cx_IFDR寄存器&…

《计算机组成原理》唐朔飞 第5章 输入输出系统 - 学习笔记

写在前面的话&#xff1a;此系列文章为笔者学习计算机组成原理时的个人笔记&#xff0c;分享出来与大家学习交流。使用教材为唐朔飞第3版&#xff0c;笔记目录大体与教材相同。 网课 计算机组成原理&#xff08;哈工大刘宏伟&#xff09;135讲&#xff08;全&#xff09;高清_…

chatgpt赋能python:Python中用什么表示空值?

Python中用什么表示空值&#xff1f; 在Python编程中&#xff0c;我们经常会遇到处理空值的场景。空值通常表示缺失的或未定义的值&#xff0c;这在数据处理和分析中尤其常见。那么&#xff0c;在Python中&#xff0c;究竟用什么来表示空值呢&#xff1f; None 在Python中&a…

6G显存玩转130亿参数大模型,仅需13行命令,RTX2060用户发来贺电

羊驼家族的Alpaca和Vicuna也都能运行&#xff0c;显存最低只需要6G&#xff0c;简直是低VRAM用户的福音有木有。 GitHub上的搭建教程火了之后&#xff0c;网友们纷纷跑来问苹果M2是不是也能跑。 这通操作的大致原理是利用最新版CUDA&#xff0c;可以将Transformer中任意数量的…

什么是先进存力?曙光存储:内铸数字底座,外成实践底气

5月26日&#xff0c;由DOIT联合中国电子学会共同举办的2023数据基础设施技术峰会在苏州举办。中科曙光存储产品事业部副总经理张新凤受邀参会&#xff0c;并在主论坛发表主题演讲&#xff0c;与数百位业内专业嘉宾伙伴共探存力发展未来。 什么样的存力能打造数字经济底座&#…

【笔记】【Javascript】javascript实现继承

前言 之前写过关于面向对象编程的文章&#xff0c;通过阅读别人的博客了解了一下Javascript实现继承的方法&#xff0c;并且使用图画的形式帮助了解&#xff0c;图是自己做的&#xff0c;若有偏差请读者帮忙指出&#xff0c;谢谢。笔记中有些个人理解后整理的笔记&#xff0c;…

基于STM32的ADC采样及各式滤波实现(HAL库,含VOFA+教程)

前言&#xff1a;本文为手把手教学ADC采样及各式滤波算法的教程&#xff0c;本教程的MCU采用STM32F103ZET6。以HAL库的ADC采样函数为基础进行教学&#xff0c;通过各式常见滤波的实验结果进行分析对比&#xff0c;搭配VOFA工具直观的展示滤波效果。ADC与滤波算法都是嵌入式较为…

MySQL进阶- Linux安装 和 索引

目录 Linux安装索引索引的概述索引的结构索引结构的介绍BtreeBtreeHash 索引的分类索引的语法&#xff08;创建&#xff0c;查看&#xff0c;删除等&#xff09;SQL性能分析SQL的执行频率&#xff08;查看SQL的执行频率&#xff09;慢查询日志show profilesexplain执行计划 索引…

video标签学习 xgplayer视频播放器分段播放mp4

文章目录 学习链接目标video标签自带视频和制作的视频区别video标签的src属性本地视频文件前端代码播放效果 服务器视频文件示例1后端代码前端代码播放效果 示例2后端代码前端代码播放效果 示例3后端配置前端代码播放效果 video对象video对象创建和获取video的属性video的方法v…

chatgpt赋能python:Python模块安装方法全解析

Python模块安装方法全解析 Python是一种功能强大的编程语言&#xff0c;拥有大量的开源库&#xff0c;这些库是在各种应用程序中使用的重要组件&#xff0c;它们能加速开发过程。不管你是初学者、中级者还是高级者&#xff0c;总会遇到需要安装第三方库的情况。但是安装库是一…

《Java并发编程实战》课程笔记(四)

互斥锁 原子性问题到底该如何解决呢&#xff1f; “同一时刻只有一个线程执行”这个条件非常重要&#xff0c;我们称之为互斥。如果我们能够保证对共享变量的修改是互斥的&#xff0c;那么&#xff0c;无论是单核 CPU 还是多核 CPU&#xff0c;就都能保证原子性了。 锁模型 …

Python连接达梦数据库

python如果想连接达梦数据库&#xff0c;必须要安装dmPython。 简介&#xff1a;dmPython 是 DM 提供的依据 Python DB API version 2.0 中 API 使用规定而开发的数据库访问接口。dmPython 实现这些 API&#xff0c;使 Python 应用程序能够对 DM 数据库进行访问。 dmPython 通…

数据库服务器

数据库服务器&#xff0c;联系Web服务器与DBMS的中间件是负责处理所有的应用程序服务器&#xff0c;包括在web服务器和后台的应用程序或数据库之间的事务处理和数据访问。 基本信息 中文名 数据库服务器 外文名 database server 功能 数据库服务器建立在数据库系统基础上&a…

系统漏洞利用与提权

任务二&#xff1a;系统漏洞利用与提权 任务环境说明&#xff1a; 服务器场景&#xff1a;PYsystem0033 服务器场景操作系统&#xff1a;Ubuntu 服务器场景用户名:未知 密码&#xff1a;未知 1.使用nmap扫描靶机系统&#xff0c;将靶机开放的端口号按从小到大的顺序作为F…

解决Vmware上的kali找不到virtualbox上的靶机的问题

解决kali找不到靶场ip问题的完整方法 1.配置靶机2.配置kali的虚拟网络3.配置kali中的eth0网络 1.配置靶机 靶机部署在Virtualbox上对其进行网络配置&#xff0c;选择连接方式为仅主机&#xff08;Host-Only&#xff09;网络。 2.配置kali的虚拟网络 在编辑中选择虚拟网络配…

chatgpt赋能python:Python中浮点数的表示方法

Python中浮点数的表示方法 在Python中&#xff0c;浮点数是一种数字类型&#xff0c;用于表示带有小数点的数值。但是&#xff0c;由于计算机在表示浮点数时存在精度限制&#xff0c;因此需要特别注意。本文将介绍Python中浮点数的表示方法及其可能导致的错误。 Python中浮点…

陕西发布!陕西省重点实验室申报条件类别、认定程序要求

本文整理了陕西省重点实验室申报条件&#xff0c;认定材料等相关内容&#xff0c;感兴趣的朋友快跟小编一起来看看吧&#xff01; 一、总体思路 本次省重点实验室布局建设工作以填补我省优势学科领域下无省级及以上科学与工程研究类科技创新基地的空白为主,同时兼顾前沿、新兴、…

MySQL基础- 多表查询 和 事务

目录 多表查询多表关系多表查询概述多表查询的分类内连接外连接自连接联合查询union&#xff0c;union all子查询标量子查询列子查询行子查询表子查询 综合练习小结 事务事务简介事务的操作四大特性ACID并发事务问题事务的隔离级别小结 多表查询 之前的SQL语句里的DQL只能进行…

数字图像学笔记 —— 18. 图像抖动算法

文章目录 为什么需要图像抖动图像抖动算法实现的基本思路常见图像抖动算法实现Floyd-Steinberg 抖动算法Atkinson 抖动算法算法实现 为什么需要图像抖动 在数字图像中&#xff0c;为了表示数字图像的细节&#xff0c;像素的颜色深度信息最少也是8位&#xff0c;即 0 − 256 0…

Linux:centos:周期性计划任务管理《crontab》

crontab常用基础属性 -e 编辑计划任务 -l 查看计划任务 -r 删除计划任务 -u 指定用户的计划任务 首先创建一个名为test的用户名 crontab时间规定 格式&#xff1a;分钟 小时 日期 月份 星期 命令 分钟-- 0-59整数 小时 -- 0-23整数 日期 -- 1--31 整数 月份 -- 1-12 整数 星期…