第九层(8):STL之set/multiset
创始人
2024-05-21 21:50:22
0

文章目录

  • 前情回顾
  • set/multiset
    • 概念
    • 区别
    • 构造函数
    • 赋值函数
    • 大小操作函数
    • 交换函数
    • 插入函数
    • 删除函数
    • 查找函数
    • 统计函数
    • 为什么set不可以插入重复数据
      • pair数组
        • pair数组创建
    • 怎么样去改变set容器的排序规则
  • 下一座石碑

🎉welcome🎉
✒️博主介绍:一名大一的智能制造专业学生,在学习C/C++的路上会越走越远,后面不定期更新有关C/C++语法,数据结构,算法,Linux,ue5使用,制作游戏的心得,和大家一起共同成长。
✈️C++专栏:C++爬塔日记
😘博客制作不易,👍点赞+⭐收藏+➕关注

前情回顾

在上一块石碑中,我学到了,同时下一块石碑也显露出来…

  • 🚄上章地址:第九层(7):STL之list

set/multiset

概念

  • 所有插入到set/multiset的数据,都会自动被排序,set/multiset的本质其实是二叉树

区别

  • set中不可以插入重复的元素
  • multiset可以插入重复的元素

构造函数

  • set/multiset的构造有两个,这里拿set的构造举例,multiset与set是一样的
set< T >;//默认构造
set(const set& s);//将s的数据拷贝到本身

使用:

#include
#include
using namespace std;void print(set& s)
{for (set::iterator b = s.begin();b != s.end(); b++){cout << *b << " ";}cout << endl;
}
void test1()
{set s;s.insert(10);print(s);set s1(s);print(s1);
}
int main()
{test1();return 0;
}

在这里插入图片描述

赋值函数

  • 对于set/multiset而言,赋值操作只有一个,是操作符重载
set& operator=(const set &s);//将s的值拷贝到本身

使用:

#include
#include
using namespace std;void print(set& s)
{for (set::iterator b = s.begin();b != s.end(); b++){cout << *b << " ";}cout << endl;
}
void test1()
{set s;s.insert(10);print(s);set s1;s1 = s;print(s1);
}
int main()
{test1();return 0;
}

在这里插入图片描述

大小操作函数

  • 在set/multiset中,对于大小是不能重新命名的,只能知道有多少个元素,或者是否为空
size()://返回容器中元素个数
empty();//判断容器是否为空

使用:

#include
#include
using namespace std;void test1()
{set s;if (s.empty()){cout << "为空" << endl;}cout << s.size() << endl;
}
int main()
{test1();return 0;
}

在这里插入图片描述

交换函数

  • set中也可以让两个容器之间进行交换,也是swap
swap(s);//和s交换数据

使用:

#include
#include
using namespace std;void print(set& s)
{for (set::iterator b = s.begin(); b != s.end(); b++){cout << *b << " ";}cout << endl;
}
void test1()
{set s;s.insert(1);set s1;s1.insert(0);cout << "交换前" << endl;print(s);print(s1);s.swap(s1);cout << "交换后" << endl;print(s);print(s1);}
int main()
{test1();return 0;
}

在这里插入图片描述

插入函数

  • 在set中,只有一种插入方式
insert(T elem);//插入一个elem

使用:

void test1()
{set s;s.insert(1);set s1;s1.insert(0);cout << "交换前" << endl;print(s);print(s1);s.swap(s1);cout << "交换后" << endl;print(s);print(s1);}
int main()
{test1();return 0;
}

在这里插入图片描述

  • 同时验证了,插入进去的数会自己进行排序,排序为从小到大

删除函数

  • 删除函数有四个基本的
clear();//删除容器中所有元素
erase(pos);//删除迭代器pos指向的元素,返回下一个元素的迭代器
erase(beg,end);//删除迭代器beg到end之间的元素,返回下一个元素的迭代器
erase(T elme);//删除容器中所有的elem,在set中是一个,但是multiset中可能有多个

使用:

#include
#include
using namespace std;void print(set& s)
{for (set::iterator b = s.begin(); b != s.end(); b++){cout << *b << " ";}cout << endl;
}
void test1()
{set s;for (int i = 0; i < 10; i++){s.insert(i);}print(s);set::iterator b = s.begin();b++; b++; b++; b++; b++;s.erase(b);print(s);set::iterator b1 = s.begin();b1++; b1++; b1++; b1++; b1++;s.erase(b1, s.end());print(s);s.erase(0);print(s);s.clear();print(s);
}
int main()
{test1();return 0;
}

在这里插入图片描述

查找函数

  • 在set中还可以查找一个元素是否存在,查找方式是通过key
find(key);//查找key是否存在,存在返回元素的迭代器,不存在返回end()

使用:

#include
#include
using namespace std;void test1()
{set s;for (int i = 0; i < 10; i++){s.insert(i);}set::iterator f=s.find(10);if (f != s.end()){cout << "找到了" << endl;}else{cout << "没有找到" << endl;}
}
int main()
{test1();return 0;
}

在这里插入图片描述

统计函数

  • 可以统计这个容器有多少个这个元素,对于set来说,只有0和1,因为set是不可以拥有重复数据的
count(key);//统计key的个数

使用:

#include
#include
using namespace std;void test1()
{set s;for (int i = 0; i < 10; i++){s.insert(i);}cout << s.count(10) << endl;cout << s.count(7) << endl;
}
int main()
{test1();return 0;
}

在这里插入图片描述

为什么set不可以插入重复数据

  • 那为什么multiset可以插入重复数据,set不可以呢?它们的区别就在这里,其他都一样,这是因为什么?是因为在set插入数据的时候,会返回插入结果,表示是否插入成功,但是multiset不会,那set怎么去检测插入是否成功呢?这里可以使用pair数组,因为对于set插入失败成功所返回的值就是用pair数组去接收的

pair数组

  • pair数组是一个拥有两种数据类型的数组,都需要使用的时候去规定,在set中,已经封装好pair数组的两个元素了,第一个为迭代器,第二个是bool,这个时候,如果插入成功,bool会返回真,如果没有插入成功,会返回假,可以去使用一下,在set插入中pair的接收是这样的:
pair< set< T >:: iterator , bool >;

检测:

#include
#include
using namespace std;void test1()
{set s;pair::iterator, bool> in = s.insert(10);pair::iterator, bool> in1 = s.insert(10);if (in.second/*访问第二个数据类型的元素*/){cout << "插入成功" << endl;}else {cout << "插入失败" << endl;}if (in1.second/*访问第二个数据类型的元素*/){cout << "插入成功" << endl;}else{cout << "插入失败" << endl;}
}
int main()
{test1();return 0;
}

在这里插入图片描述

pair数组创建

  • 在有两个成对的数据出现的时候,就可以利用pair接收两个数据,那怎么去创建一个pair数组呢?有两种方式
pair< T1, T2/*数据类型*/ > p(t1 ,t2/*数据*/);
pair< T1, T2/*数据类型*/ > p=make_pair(t1 ,t2/*数据*/);

使用:

#include
#include
using namespace std;void test1()
{pair p(10, 20);cout << p.first << " " << p.second << endl;pairp1 = make_pair(10, 20);cout << p1.first << " " << p1.second << endl;
}
int main()
{test1();return 0;
}

在这里插入图片描述

怎么样去改变set容器的排序规则

  • 如果现在创建了一个set容器,但是不想让它按着从小到大的顺序排,想按照从大到小排,可以吗?是可以的,可以利用仿函数去改变,将有这个仿函数的类当类型传给set容器

使用:

#include
#include
using namespace std;class sort_big
{
public:bool operator()(int v1, int v2) const{return v1 > v2;}
};
void test1()
{set s;for (int i = 0; i < 10; i++){s.insert(i);}
;	for (set::iterator b = s.begin(); b != s.end(); b++){cout << *b << " ";}
}
int main()
{test1();return 0;
}

在这里插入图片描述

下一座石碑

  • 这座石碑倒下了,露出了下一座石碑…

😘预知后事如何,关注新专栏,和我一起征服C++这座巨塔
🚀专栏:C++爬塔日记
🙉都看到这里了,留下你们的👍点赞+⭐收藏+📋评论吧🙉

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...