【C++常用容器】STL基础语法学习set容器

news2024/9/24 3:21:17


目录

●set构造和赋值

●set大小和交换

●set插入和删除

●set查找和统计

●set排序(改变其排序规则,仿函数的运用)

●set和multiset

1.对组(pair)的创建

2.set的验证(不可以重复插入数据)

3.multiset的验证(可以重复插入数据)


●set构造和赋值

函数原型:

        1.构造

        ■set<T> st         //默认构造函数

        ■set(const set &st)         //拷贝构造函数 

       2. 赋值

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

#include<iostream>
#include<set>
using namespace std;
void printset(set<int>&s)
{
	for (set<int>::iterator i = s.begin(); i != s.end(); i++)
	{
		cout << *i<<" ";
	}
	cout << endl;
}
void text()
{
	//set容器:在所有元素插入的时候自动被被升序排序,该容器不允许插入重复值
	set<int>s;
	//默认构造
	for (int i = 10; i >= 1; i--)
	{
		s.insert(i);   //插入数据只有insert
	}
	//拷贝构造
	set<int>s1(s);
	printset(s1);
	//赋值
	set<int>s2;
	s2 = s;
	printset(s1);
}
int main()
{
	text();
}


●set大小和交换

函数原型:

        1.大小

        ■size()         //返回容器中元素的数目

        ■empty()         //判断容器是否为空

        2.交换

        ■swap(st)         //交换两个集合容器

#include<iostream>
#include<set>
using namespace std;
void printset(set<int>&s)
{
	for (set<int>::iterator i = s.begin(); i != s.end(); i++)
	{
		cout << *i<<" ";
	}
	cout << endl;
}
void size(set<int>& s)
{
	cout<<"s的大小为:"<<s.size()<<endl;
}
void isempty(set<int>&s)
{
	if (s.empty()) {
		cout << "s为空" << endl;
	}
	else {
		cout << "s不为空" << endl;
		size(s);
	}
}
void swap(set<int>& s1, set<int>& s2)
{
	cout << "交换前:" << endl;
	printset(s1);
	printset(s2);
	cout << "交换后:" << endl;
	s1.swap(s2);
	printset(s1);
	printset(s2);
}
void text()
{
	set<int>s;
	s.insert(45);
	s.insert(12);
	s.insert(99);
	s.insert(67);
	s.insert(10);
	printset(s);
	//判断是否为空并且输出大小为多少
	isempty(s);
	//交换
	set<int>s1;
	s1.insert(1);
	s1.insert(2);
	s1.insert(3);
	set<int>s2;
	s2.insert(4);
	s2.insert(5);
	s2.insert(6);
	swap(s1,s2);
}
int main()
{
	text();
}


●set插入和删除

函数原型:

        1.插入

        ■insert(elem); //在容器中插入元素

        2.删除

        ■clear()         //清除所有元素 

        ■erase(pos)         //删除pos迭代器所指的元素,返回下一个元素的迭代器

        ■erase(beg,end)         //删除区间[beg,end)的所有元素,返回下一个元素的迭代器

        ■erase(elem)         //删除容器中值为elem的元素

#include<iostream>
#include<set>
using namespace std;
void printset(set<int>&s)
{
	for (set<int>::iterator i = s.begin(); i != s.end(); i++)
	{
		cout << *i<<" ";
	}
	cout << endl;
}
void text()
{
	set<int>s;
	for (int i = 10; i >= 1; i--)
	{
		s.insert(i);
	}
	printset(s);	//1 2 3 4 5 6 7 8 9 10
	
	//删除
	s.erase(s.begin());
	printset(s);	//2 3 4 5 6 7 8 9 10
	s.erase(3);
	s.erase(5);
	s.erase(7);
	s.erase(9);
	printset(s); //2 4 6 8 10

	//清空
	//s.erase(s.begin(), s.end());
	s.clear();
	printset(s);
}
int main()
{
	text();
}


●set查找和统计

函数原型:

        1.查找

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

        2.统计

        ■count(key)         //统计key的元素个数

#include<iostream>
#include<set>
using namespace std;
void find(set<int>&s)
{
	cout << "请输入在set容器中要查找的数:";
	int n; cin >> n;
	set<int>::iterator i = s.find(n);
	if (i != s.end()) {
		cout << "找到元素:" << *i << endl;
	}
	else {
		cout << "未找到元素" << endl;
	}
}
void count(set<int>& s)
{
	cout << "请输入在set容器中要统计的数:";
	int n; cin>>n;
	//由于set容器不允许插入重复值,所以最终个数的结果要么1,要么0
	cout << "在set容器中该数的个数:"<<s.count(n) << endl;
}
void text()
{
	set<int>s;
	s.insert(10);
	s.insert(20);
	s.insert(20);
	s.insert(30);
	s.insert(40);
	//查找指定元素
	find(s);
	//统计指定元素
	count(s);
}
int main()
{
	text();
}


 ●set排序(改变其排序规则,仿函数的运用)

1.内置数据类型

#include<iostream>
#include<set>
using namespace std;
class compare {
public:
	bool operator()(int s1,int s2) const //布尔bool+重载operator()+set的模板参数列表(int s1,int s2)+const
	{
		return s1 > s2;
	}
};
void printset_1(set<int>&s1)
{
	for (set<int>::iterator i = s1.begin(); i != s1.end(); i++)
	{
		cout << *i<<" ";
	}
	cout << endl;
}
void printset_2(set<int,compare>&s2)
{
	for (set<int,compare>::iterator i = s2.begin(); i != s2.end(); i++)
	{
		cout << *i << " ";
	}
	cout << endl;
}
void text()
{
	//按set初始状态从小到大排序
	set<int>s1;
	s1.insert(45);
	s1.insert(12);
	s1.insert(99);
	s1.insert(67);
	s1.insert(10);
	printset_1(s1);

	//将set排序的规则改为从大到小
	set<int, compare>s2;
	s2.insert(45);
	s2.insert(12);
	s2.insert(99);
	s2.insert(67);
	s2.insert(10);
	printset_2(s2);
}
int main()
{
	text();
}

2.自定义数据类型

#include<iostream>
#include<string>
#include<set>
using namespace std;
class person {
public:
	person(string name,string sex,int age)
	{
		this->name=name;
		this->sex = sex;
		this->age = age;
	}
	string name;
	string sex;
	int age;
};
class compare {
public:
	bool operator()( person p_1, person p_2)const
	{
		return p_1.age > p_2.age;
	}
};
void printset(set<person, compare>&s)
{
	for (set<person, compare>::iterator i = s.begin(); i != s.end(); i++)
	{
		cout << "姓名:" << i->name <<" " << "性别:" << i->sex<<" " << "年龄:" << i->age << endl;
	}
}
void text()
{
	set<person,compare>s;
	person p1("张三","男",34);			s.insert(p1);
	person p2("李四", "男", 14);		s.insert(p2);
	person p3("王五", "男", 24);		s.insert(p3);
	person p4("赵六", "男", 18);		s.insert(p4);
	person p5("孙七", "男", 16);		s.insert(p5);
	printset(s);
}
int main()
{
	text();
}


●set和multiset

区别:

        1.set不可以插入重复数据,而multiset可以;

        2.set插入数据的同时会返回插入结果,表示插入是否成功;

        3.multiset不会检测数据,因此可以插入重复数据;

1.对组(pair)的创建

简要介绍:成对出现的数据,利用对组可以返回两个数据

创建方式:

                ■pair<type, type> p ( value1, value2 );

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

#include<iostream>
#include<string>
using namespace std;
void text()
{
	pair<string, int>p1("zhangsan", 20);
	cout << "姓名:" << p1.first << " " << "年龄:" << p1.second << endl;
	
	pair<string, int>p2 = make_pair("lisi", 21);
	cout << "姓名:" << p2.first<< " " << "年龄:" << p2.second << endl;
}
int main()
{
	text();
}

2.set的验证(不可以重复插入数据)

         转到insert定义查看其底层代码,可知其底层为pair对组,所以我们想要去验证set的不可以重复插入数据,就需要用pair对组去验证。

#include<iostream>
#include<set>
using namespace std;
void judge(pair<set<int>::iterator, bool>&record)
{
	if (record.second) {
		cout << "插入成功" << endl;
	}
	else {
		cout << "插入失败" << endl;
	}
}
void text()
{
	set<int>s;
	//采用pair对组去观察第一次插入和第二次插入的bool值,也就是判断	record.second 的值从而验证set容器不能插入重复值
	pair<set<int>::iterator, bool>record;
	cout << "第一次插入" << endl;
	record = s.insert(10);  
	judge(record);
	cout << "第二次插入" << endl;
	record = s.insert(10);
	judge(record);
}
int main()
{
	text();
}

3.multiset的验证(可以重复插入数据)

         转到insert定义查看其底层代码,可知其底层为一个迭代器。迭代器不会去判断插入是否成功与失败,所以multiset可以重复的去插入你所指定类型的数据。        

#include<iostream>
#include<set>
using namespace std;
void text()
{
	multiset<int>ms;
	//允许插入重复数据
	ms.insert(10);
	ms.insert(10);
	ms.insert(10);
	for (multiset<int>::iterator i = ms.begin(); i != ms.end(); i++)
	{
		cout << *i << " ";
	}
	cout << endl;
}
int main()
{
	text();
}


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

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

相关文章

《QDebug 2022年12月》

一、Qt Widgets 问题交流 二、Qt Quick 问题交流 1、在 C 中关联 QQuickWindow 的 closing 信号提示 "使用了未定义类型QQuickCloseEvent" 因为 closing 信号中的参数类型是 private 模块中定义的&#xff0c;但是通过第二句提示我们知道找到了完整定义才能使用 Q_…

安装并配置uwsgi(1)

今天分享的主题是安装并配置uwsgi。 假设我们‍‍腾讯云主机里面的整个后端的源码&#xff0c;包括运行环境都已经没有问题了&#xff0c; 我们要把这个给挂到我们的 uwsgi 的服务器上&#xff0c; 因为这个服务器它支持 uwsgi 的协议&#xff0c;它能够跟我们的Django的进行一…

Shell——echo、printf及彩色打印

文章目录printfprintf格式常用的转义字符echoecho打印的格式echo打印的三种方式echo支持的转义字符关于打印叹号&#xff08;!&#xff09;彩色输出printf printf格式 printf “格式化字符串” 变量 printf的使用方法与C语言一样&#xff0c;并且不需要括号和逗号进行分隔&…

【自学Python】Python诞生

Python诞生 Python诞生教程 1989 年的圣诞节期间&#xff0c;吉多范罗苏姆为了在阿姆斯特丹打发时间&#xff0c;决心开发一个新的解释程序&#xff0c;作为 ABC 语言的一种继承。 ABC 语言是由吉多参加设计的一种教学语言&#xff0c;就吉多本人看来&#xff0c;ABC 这种语…

如何使用 Java Stream API ,一行代码将 List 转换为 Map 类型

文章目录一句话场景语法测试关键语句截图Source Code控制台输出一句话 List<User> --> Map<User对象中欲作为key的字段的类型, User> List<User> userList getUserList(); Map<Integer, User> idAndUserMap userList.stream().collect(Collecto…

2022朝花夕拾-持续快速成长

2022年又过去了&#xff0c;学业繁忙好久没和大家聊天了。2020年终总结2020朝花夕拾-不务正业的大学生做了什么比赛&#xff1f;和2021年终总结2021朝花夕拾-我在校搞副业实现经济独立在此&#xff0c;幸好去年立了年度目标。如今在回忆这一年的收获时&#xff0c;也可以一项项…

通过SQLserver执行系统命令

前言 咋说呢&#xff0c;就是把&#xff0c;我最近找工作然后库库投校招的简历&#xff0c;然后呢&#xff0c;我接到了一个青藤云的笔试机会&#xff0c;哇&#xff01;我激动的不行&#xff0c;然后我什么都没有准备的上线进行一波答题&#xff0c;答完总结下来&#xff0c;…

使用python实现跨年烟花代码

朋友们&#xff0c;有多久没放烟花了&#xff1f;今年你所在的地方允许放烟花么&#xff1f;既然我们不能线下放&#xff0c;那么我们就在线上放个够吧&#xff08;还是那句话&#xff1a;你~有~对~象~了~嘛~&#xff09; 一下是动态图&#xff08;图片我使用的我上几次的背景图…

算法设计与分析复习02:分而治之算法

算法设计与分析复习02&#xff1a;分而治之算法 文章目录算法设计与分析复习02&#xff1a;分而治之算法复习重点分而治之算法全排列递归算法矩阵乘法的Strassen算法棋盘覆盖线性时间选择复习重点 分而治之算法 全排列递归算法 #include<vector> #include<iostream&g…

await如何优雅的捕获异常?

传统方式 try { const res await getUser(id) }catch(err){console.log(err) } await让我们使用异步方式开发的代码简便不少&#xff0c;但是每次使用如果都用try..catch来捕获异常反而埋没了它的优势。 [ err, user ] await to(UserModel.findById(1)); 如果我们使用await…

CSS var() 自定义的属性值和使用

声明全局 CSS 变量 :root{<自定义属性名>: <自定义属性值>; }自定义属性名必需以 -- 开头。 :root :root 这个 CSS 伪类匹配文档树的根元素。对于 HTML 来说&#xff0c;:root 表示 <html> 元素&#xff0c;除了优先级更高之外&#xff0c;与 html 选择器…

【Docker】构建自定义镜像

文章目录1. 镜像制作的两种方法2. Commit构建自定义镜像3. Dockerfile构建镜像4. 镜像的分层结构5. Dockerfile基础指令6. Java服务器镜像构建7. Nginx镜像构建8. Redis镜像构建9. 快速部署MySQL并初始化1. 镜像制作的两种方法 基于Docker Commit制作镜像基于Dockerfile制作镜…

WIKO+鸿蒙生态:海外品牌中国化的新范式

想要理解快速变化的科技行业&#xff0c;往往要锚定一些标杆型企业&#xff0c;它们的风吹草动&#xff0c;可能就是行业接下来的地动山摇。就像互联网绕不过BAT&#xff0c;手机行业的趋势也少不了鸿蒙的消息。最近&#xff0c;有一件鸿蒙生态的新闻是比较特别的。我们报道过很…

java反射基础

Java反射机制提供的功能 在运行时判断任意一个对象所属的类 在运行时构造任意一个类的对象 在运行时判断任意一个类所具有的成员变量和方法 在运行时获取泛型信息 在运行时调用任意一个对象的成员变量和方法 在运行时处理注解 生成动态代理 Java反射优点和缺点 优点: …

Linux free命令详解,Linux查看内存使用情况

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 free一、常用操作二、字段解释1、free和available的区别&#xff1f;2、交换分区的作用&#xff1f;三、内存使用情况分析技巧四、原理&…

人脸识别检测项目实战

文章目录 一、项目介绍 二、环境配置 三、项目知识储备 导入图片灰度转换 修改图片尺寸的大小矩形检测框图绘制 人脸检测识别 多个人脸检测效果对人脸视频进行检测数据集录入训练数据人脸识别过程 项目介绍 人脸识别在现代化中应用较为广泛&#xff0c;比如人脸考勤系统等&…

Python爬虫——Scrapy 的基本使用

Scrapy 框架中创建项目、查看配置信息&#xff0c;以及运行爬虫程序都是通过指令完成。 常用指令如下所示&#xff1a; 指令格式说明startprojectscrapy startproject <项目名>创建新项目genspiderscrapy genspider <爬虫文件名> <访问的域名>新建爬虫文件…

torchnet package (1)

torchnet torchnet用于torch的代码复用和模块化编程框架,主要包含四个类 Dataset: 以不同的方式对数据进行预处理.Engine: 训练/测试机器学习方法Meter评估方法性能Log日志. Documentation torchnet的调用 local tnt require ‘torchnet’ tnt.Dataset() torchnet提供了多…

VueJs中的reactive函数

前言一个基本类型的数据,想要变成响应式数据,那么需要通过ref函数包裹,而如果是一个对象的话,那么需要使用reactive函数reactive可将对象变成响应式将一个对象类型的数据变为响应式,如果是基本数据类型,那用refconst 代理对象 reactive(被代理对象)接收一个对象(或数组),返回一…

一个DevOps/SRE/运维的2022年碎碎语

人们常说&#xff1a;情商高的人会说话。实际上他们的意思是对人说人话&#xff0c;对鬼说鬼话&#xff0c;这样的人才有前途。很长时间里&#xff0c;我一直以为我无法理解他们为什么要推崇心口不一。后来&#xff0c;我知道了。我不是不理解。我只是不服气。这样的”不服气“…