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

🤔结束!

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

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

相关文章

MySQL之数据库基本查询语句

——————今天距2020年43天—————— 这是ITester软件测试小栈第80次推文 SELECT 基本查询语句 查询单个列 #查询Author表name列的值 select name from Author;查询多个列 #查询Author表id,name两列的值 select id,name from Author;查询所有列 #查询Author表所有列的信息…

泔水()

欢迎大家观看本人第一张博客 16340218 数据科学与计算机学院 目录 数学干货之不等式 均值不等式幂平均不等式柯西不等式琴生不等式证明不等式的小策略 函数法“暴力”积分法数学归纳法水货-大学感想 一、各类不等式 1.均值不等式 平方平均数 ≥ 算术平均数 ≥ 几何平均数…

【Mysql】mysql数据库的查询语句

单表查询 1、普通查询 &#xff08;1&#xff09;命令&#xff1a;select * from <表名>;//通匹 &#xff08;2&#xff09;命令&#xff1a;select <要查询的字段> from <表名>&#xff1b; 2、去重查询&#xff08;distinct&#xff09; 命令&#xff1a;…

Metasploit超详细安装及使用教程(图文版)

通过本篇文章&#xff0c;我们将会学习以下内容&#xff1a; 1、在Windows上安装Metasploit 2、在Linux和MacOS上安装Metasploit 3、在Kali Linux中使用 Metasploit 4、升级Kali Linux 5、使用虚拟化软件构建渗透测试实验环境 6、配置SSH连接 7、使用SSH连接Kali 8、配…

基于深度学习的高精度汽车自行车检测识别系统(PyTorch+Pyside6+模型)

摘要&#xff1a;基于深度学习的高精度汽车自行车检测识别系统可用于日常生活中检测与定位汽车自行车目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的汽车自行车目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目…

Kotlin笔记(零)简介

百度百科简介 2017年&#xff0c;google公司在官网上宣布Kotlin成为Android的开发语言&#xff0c;使编码效率大增。Kotlin 语言由 JetBrains 公司推出&#xff0c;这是一个面向JVM的新语言 参考资料 官网&#xff1a;https://kotlinlang.org/中文官网&#xff1a;https://w…

【测试基础02】

测试基础02 一、HTML基础二、Python导入三方模块三、安装webgrock驱动四、元素定位(1)、元素定位工具(2)、元素定位方式(3)、XPATH路径(3)、CSS选择器 五、Selenium WebDriver初步应用(1)、基本方法(2)、测试案例1(3)、测试案例2(3)、测试案例3 六、获取元素信息的方法七、fram…

黑马Redis视频教程实战篇(三)

目录 一、优惠券秒杀 1.1 全局唯一ID 1.2 Redis实现全局唯一ID 1.3 添加优惠卷 1.4 实现秒杀下单 1.5 库存超卖问题分析 1.6 代码实现乐观锁解决超卖问题 1.7 优惠券秒杀-一人一单 1.8 集群环境下的并发问题 二、分布式锁 2.1 基本原理和实现方式对比 2.2 Redis分布…

QQ截屏快速获取像素颜色

QQ截屏快速获取像素颜色 qq截屏的快捷键是 CTRL ALT A qq截屏除了截屏 还有个很不错的小功能 获取像素的颜色 是大家都容易忽略的 具体方法很简单 第一步 按下 Ctrl Alt A 快捷键 但是 不要点击鼠标 第二步 移动鼠标 到你想要像素点的颜色 如图所示 按C 即可复制 RGB十进…

计算机如何共享桌面,怎么共享电脑屏幕?

在平时的工作生活中&#xff0c;有的时候我们需要把自己的电脑屏幕共享到另一台电脑上&#xff0c;来方便给同事或者朋友演示一些操作。今天在这里给大家分享2个电脑屏幕共享的方法&#xff0c; 2种电脑屏幕共享的方法 幕享电脑投屏 幕享&#xff0c;英文名叫Letsview&#xff…

超简单友盟分享(微信、QQ)+ 原生微信分享

超简单友盟分享&#xff08;微信、QQ&#xff09; 原生微信分享 友盟分享&#xff08;微信、QQ&#xff09;原生微信分享QQ分享&#xff08;使用Android原生的api跳转QQ&#xff09; 友盟分享&#xff08;微信、QQ&#xff09; 之前写的项目好好的&#xff0c;后来打开就报这个…

手机端 html 怎么分享到朋友圈,【Web前端问题】移动web页面如何实现分享到微信、QQ等分享功能?...

移动web页面(浏览器打开的web应用&#xff0c;非App内置的Web页面)内有分享按钮&#xff0c;点击可分享到朋友圈&#xff0c;微信好友&#xff0c;QQ...... 据说是使用相关插件&#xff0c;求指导&#xff01; 回答&#xff1a; 如果不是app内置web页面,只能使用js的一键分享.具…

QQ空间说说批量删除

怎么批量删除QQ空间说说&#xff1f; 第一步&#xff1a;用电脑打开浏览器登录你的QQ空间 第二步&#xff1a;点击你的说说栏目 第三步&#xff1a;按下电脑的F12键或者点击右上角的菜单一栏&#xff0c;点击开发者工具 第四步&#xff1a;看到右半边屏幕&#xff0c;找到…

Android实现截图分享qq,微信

代码地址如下&#xff1a;http://www.demodashi.com/demo/13292.html 前言 现在很多应用都有截图分享的功能&#xff0c;今天就来讲讲截图分享吧 今天涉及到以下内容&#xff1a; 1. android权限设置及申请 2. 截图分享功能解析 3. 截图分享功能的调用 4. 项目结构图和效…

分享qq报错Only fullscreen opaque activities can request orientation

这两天突然发现了一个项目中分享链接到qq时崩溃但分享到微信却啥事没有的问题&#xff0c;然后连上usb&#xff0c;查看error发现报了这样一个错&#xff1a;Only fullscreen opaque activities can request orientation。然后就在网上搜答案&#xff0c;原来是安卓8才出现的问…

超级便捷精巧绿色的屏幕分享小软件IntelexEMC

摘要&#xff1a;因需求特殊&#xff0c;即需要在关闭QQ、微信或其他通讯软件的情况下进行屏幕分享。于是&#xff0c;整理好思路&#xff0c;开始写一个简易的屏幕分享软件&#xff0c;打了鸡血似的写了两天&#xff0c;突然&#xff0c;在查资料时发现网上有一款名叫InletexE…

Flutter 项目实战 截图分享到微信|QQ|微博 十二

/ 截图功能演示 / / 跨进程通信案例 / 调用三方app进行支付 : 支付宝支付、微信支付、银行app支付 ........ 调用三方app进行分享 : 微信分享、QQ分享、微博分享、钉钉分享、分享邮箱、打印、蓝牙....... 调用三方app进行登录 : 微信登录、QQ登录、微博登录、支付宝登录、Twit…

直接在屏幕上,选取区域进行截屏分享到QQ、微信

在手机屏幕上&#xff0c;选择某个区域进行截屏。 1&#xff0c;借用网络上一张图片&#xff0c;说明每个点的位置&#xff0c;主要是左上角和右下角这两个点。中间那块浅蓝色的就是我们的目标区域了 /*** 将一个view保存成图片* param view 传入的目标view* return*/public…

android qq悬浮窗口,qq悬浮窗口在哪里打开?怎么设置QQ悬浮窗?qq悬浮窗口设置方法分享...

QQ悬浮窗口在哪打开 qq悬浮 1.打开手机设置应用&#xff0c;点击进入设置界百面。 2.在设置应用中&#xff0c;选择“其他度应用管理”选问项。 3.打开选择答已经安装的应用&#xff0c;选择“QQ”。 4.点击“权限回管理”&#xff0c;进入权限管理界面。 5.点击“显示悬浮窗”…

qq三国行脚商脚本思路分享

qq三国行脚商玩法基于按键精灵脚本写作思路分享 欢迎和我一起学习讨论游戏脚本的写作过程游戏玩法简介脚本写作思路知易行难后续痛点和优化自我介绍后记 欢迎和我一起学习讨论游戏脚本的写作过程 你好呀&#xff01; 这是你第一次来到我的主页。如果你想学习如何使用按键精灵等…