C++STL set/multiset容器 构造和赋值 大小和交换 插入和删除 查找和统计

文章目录

  • set/multiset容器
    • 1 set容器 基本概念
    • 2 set容器 构造和赋值
    • 3 set容器 大小和交换
    • 4 set容器 插入和删除
    • 5 set容器 查找和统计

set/multiset容器

1 set容器 基本概念

简介: 所有元素都会在插入时会被自动排序,例如,在set容器放入元素1、5、9、3、4、7时,打印输出变成1、3、4、5、7、9.

本质: set/multiset属于关联式容器,底层结构是用二叉树实现。

set和multiset区别

  • set:不允许容器中有重复的元素,不能插重值元素
  • multiset:允许容器中有重复的元素,可以插重值元素
  • 两个容器使用时,包含头文件#include<set>即可

2 set容器 构造和赋值

功能描述: 创建set容器以及赋值

构造:

  • set<T> st; //默认构造函数:
  • set(const set &st); //拷贝构造函数
    注意: 和之前的容器不同,没有像string、vector、deque、list一样有push_back()、push_front()、pop_back()、pop_front()插入数据,也没有像stack、queue一样有push()和pop()插入数据。set插入数据时只有insert()。

赋值:

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

代码示例:

void printSet(const set<int>& s)
{
	for (set<int>::const_iterator it = s.begin(); it != s.end(); it++)
	{
		cout << *it << "  ";
	}
	cout << endl;
}

void printmMultiset(const multiset<int>& s)
{
	for (multiset<int>::const_iterator it = s.begin(); it != s.end(); it++)
	{
		cout << *it << "  ";
	}
	cout << endl;
}

void test()
{
	int n = 50;
	set<int> s1;

	//set只有insert()方式插入数据
	s1.insert(18);
	s1.insert(23);
	s1.insert(25);
	s1.insert(23);
	s1.insert(21);
	s1.insert(23);
	s1.insert(20);

	cout << "默认构造 set\t   s1:";
	//set容器特点:所有元素插入时会被排序,且不允许有重复元素
	printSet(s1);
	cout << string(n, '-') << endl;

	set<int> s2(s1);
	cout << "拷贝构造 set\t   s2:";
	printSet(s2);
	cout << string(n, '-') << endl;

	set<int> s3;
	s3 = s2;
	cout << "复制操作 set\t   s3:";
	printSet(s3);
	cout << string(n, '-') << endl;
	
	multiset<int> s4;
	//multiset只有insert()方式插入数据
	s4.insert(18);
	s4.insert(23);
	s4.insert(25);
	s4.insert(23);
	s4.insert(21);
	s4.insert(23);
	s4.insert(20);
	cout << "默认构造 multiset  s4:";
	//multiset容器特点:所有元素插入时会被排序,且允许有重复元素
	printmMultiset(s4);
	cout << string(n, '-') << endl;
}

在这里插入图片描述
总结:

  • set容器插入数据时用insert
  • set容器插入数据的数据会自动排序
  • set不允许有重复元素,mutiset允许有重复元素

3 set容器 大小和交换

功能描述: 统计set容器大小以及交换set容器

函数原型:

  • size(); //返回容器中元素的数目
  • empty(); //判断容器是否为空
  • swap(st); //交换两个集合容器

注意: 在set中没有resize(),不允许重新指定大小。在之前学习的容器中,resize()默认机制是0填充,而set不允许有重复值,所有不能有resize()。

代码示例:

void printSet(const set<int>& s)
{
	for (set<int>::const_iterator it = s.begin(); it != s.end(); it++)
	{
		cout << *it << "  ";
	}
	cout << endl;
}

void printmMultiset(const multiset<int>& s)
{
	for (multiset<int>::const_iterator it = s.begin(); it != s.end(); it++)
	{
		cout << *it << "  ";
	}
	cout << endl;
}

void setisEmpty(const set<int>& s)
{
	if (s.empty())
	{
		cout << "set容器为空!" << endl;
	}
	else
	{
		cout << "set容器不为空,且容器大小为:" << s.size() << endl;
	}
}

//大小
void test1()
{
	cout << "大小操作\n" << endl;
	int n = 50;
	set<int> s1;
	cout << "插值前 set\ts1:";
	printSet(s1);
	setisEmpty(s1);
	cout << string(n, '-') << endl;

	//set只有insert()方式插入数据
	s1.insert(18);
	s1.insert(23);
	s1.insert(25);
	s1.insert(23);
	s1.insert(21);
	s1.insert(23);
	s1.insert(20);

	cout << "插值后 set\ts1:";
	printSet(s1);
	setisEmpty(s1);
	cout << string(n, '-') << endl;
}

//交换
void test2()
{
	cout << "\n交换操作\n\n交换前" << endl;
	int n = 50;
	multiset<int> s1;
	s1.insert(18);
	s1.insert(23);
	s1.insert(25);
	s1.insert(23);
	s1.insert(21);
	s1.insert(23);
	s1.insert(20);
	cout << "multiset\ts1:";
	printmMultiset(s1);
	cout << string(n, ' ') << endl;

	multiset<int> s2;
	s2.insert(14);
	s2.insert(10);
	s2.insert(15);
	s2.insert(11);
	s2.insert(12);
	s2.insert(13);
	cout << "multiset\ts2:";
	printmMultiset(s2);
	cout << string(n, '-') << endl;

	cout << "交换后\ns1:";
	printmMultiset(s1);
	cout << string(n, ' ') << endl;
	cout << "s2:";
	printmMultiset(s2);
	cout << string(n, '-') << endl;
}

在这里插入图片描述

总结:

  • 统计大小 — size,不支持resize
  • 判断是否为空 — empty
  • 交换容器 — swap

4 set容器 插入和删除

功能描述: set容器进行插入数据和删除数据

函数原型:

  • insert(elem); //在容器中插入元素。
  • clear(); //清除所有元素
  • erase(pos); //删除pos迭代器所指的元素,返回下一个元素的迭代器。
  • erase(beg, end); //删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。
  • erase(elem); //删除容器中值为elem的元素。

注意: 没有头插头删和尾插尾删的操作,插入只有insert。set的删除可以传入迭代器、区间,还可以指定值删除,类似于list的remove。

代码示例:

void printSet(const set<int>& s)
{
	for (set<int>::const_iterator it = s.begin(); it != s.end(); it++)
	{
		cout << *it << "  ";
	}
	cout << endl;
}

//插入
void test1()
{
	int n = 50;
	set<int> s1;
	//set只有insert()方式插入数据
	s1.insert(18);
	s1.insert(23);
	s1.insert(25);
	s1.insert(23);
	s1.insert(21);
	s1.insert(23);
	s1.insert(20);

	cout << "删除前\t\ts1:";
	printSet(s1);
	cout << string(n, '-') << endl;

	//删除
	s1.erase(s1.begin());//删除第一个元素
	cout << "删除第一个元素\ts1:";
	printSet(s1);
	cout << string(n, '-') << endl;

	s1.erase(21);//删除指定元素
	cout << "删除指定元素\ts1:";
	printSet(s1);
	cout << string(n, '-') << endl;

	//清空
	//s1.erase(s1.begin(), s1.end());//erase清空
	s1.clear();
	cout << "清空\t\ts1:";
	printSet(s1);
	cout << string(n, '-') << endl;
}

在这里插入图片描述
总结:

  • 插入 — insert
  • 删除 — erase,可以指定元素删除,类似list的remove
  • 清空 — clear

5 set容器 查找和统计

功能描述: 对set容器进行查找数据以及统计数据

函数原型:

  • find(key); //查找key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回set.end(),结束的位置
  • count(key); //统计key的元素个数。对set而言,返回值是0或1,set不允许有重复值;对multiset而言,返回值有可能大于1,multiset允许有重复值。

代码示例:

void printSet(const set<int>& s)
{
	for (set<int>::const_iterator it = s.begin(); it != s.end(); it++)
	{
		cout << *it << "  ";
	}
	cout << endl;
}


void printMultiset(const multiset<int>& s)
{
	for (multiset<int>::const_iterator it = s.begin(); it != s.end(); it++)
	{
		cout << *it << "  ";
	}
	cout << endl;
}


void test1()
{
	int n = 50;
	set<int> s1;
	s1.insert(18);
	s1.insert(23);
	s1.insert(25);
	s1.insert(23);
	s1.insert(21);
	s1.insert(23);
	s1.insert(20);

	multiset<int> s2;
	s2.insert(18);
	s2.insert(23);
	s2.insert(25);
	s2.insert(23);
	s2.insert(21);
	s2.insert(23);
	s2.insert(20);

	cout << "s1:";
	printSet(s1);
	cout << string(n, ' ') << endl;

	cout << "s2:";
	printMultiset(s2);
	cout << string(n, '-') << endl;

	//查找
	cout << "\n查找" << endl;
	set<int>::iterator pos1 = s1.find(21);
	cout << "查找21元素\ns1:";
	if (pos1!=s1.end())
	{
		cout << "查找成功,值为:" << * pos1 << endl;
	}
	else
	{
		cout << "查找失败,值不存为或为空容器!" << endl;
	}
	cout << string(n, ' ') << endl;

	set<int>::iterator pos2 = s2.find(21);
	cout << "查找21元素\ns2:";
	if (pos2 != s2.end())
	{
		cout << "查找成功,值为:" << *pos2 << endl;
	}
	else
	{
		cout << "查找失败,值不存为或为空容器!" << endl;
	}
	cout << string(n, '-') << endl;

	//统计
	cout << "\n统计" << endl;
	int num1 = s1.count(23);
	cout << "set    s1中23的个数为:" << num1 << endl;
	cout << string(n, '-') << endl;

	int num2 = s2.count(23);
	cout << "multiset s2中23的个数为:" << num2 << endl;
	cout << string(n, '-') << endl;
}

在这里插入图片描述

总结:

  • 查找 — find (返回的是迭代器)
  • 统计 — count (对于set,结果为0或者1)

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

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

相关文章

成本降低90%,OpenAI正式开放ChαtGΡΤ

今天凌晨&#xff0c;OpenAI官方发布ChαtGΡΤ和Whisper的接囗&#xff0c;开发人员现在可以通过API使用最新的文本生成和语音转文本功能。OpenAI称&#xff1a;通过一系列系统级优化&#xff0c;自去年12月以来&#xff0c;ChαtGΡΤ的成本降低了90%&#xff1b;现在OpenAI用…

公网远程连接Oracle数据库【内网穿透】

文章目录1. 数据库搭建2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射3. 公网远程访问4. 配置固定TCP端口地址4.1 保留一个固定的公网TCP端口地址4.2 配置固定公网TCP端口地址4.3 测试使用固定TCP端口地址远程OracleOracle&#xff0c;是甲骨文公司的一款关系数据库管理系…

【前端vue2面试题】2023前端最新版vue2模块,高频24问

​ &#x1f973;博 主&#xff1a;初映CY的前说(前端领域) &#x1f31e;个人信条&#xff1a;想要变成得到&#xff0c;中间还有做到&#xff01; &#x1f918;本文核心&#xff1a;博主收集的关于vue2面试题 目录 vue2面试题 1、$route 和 $router的区别 2、一个.v…

2月更新 | Visual Studio Code Python

我们很高兴地宣布&#xff0c;2023年2月版 Visual Studio Code Python 和 Jupyter 扩展现已推出&#xff01;此版本包括以下改进&#xff1a;从激活的终端启动 VS Code 时的自动选择环境 使用命令 Python: Create Environmen 时可选择需求文件或可选依赖项 预发布&#xff1a;改…

java八股文--java基础

java基础1.什么是面向对象&#xff0c;谈谈对面向对象的理解2.JDK JRE JVM的区别与联系3.和equals4.hashCode与equals5.String StringBuffer StringBuilder的区别6.重载和重写的区别7.接口和抽象类8.List和Set的区别9.ArrayList和LinkedList10.HashMap和HashTable的区别&#x…

2023.03.12学习总结

项目部分写了内外菜单栏的伸缩&#xff0c;更新了导航栏&#xff0c;新增配置&#xff0c;scss变量 提交记录 学习了scss的使用和配置 &#xff0c;设置了scss全局变量&#xff0c;组件样式 给element-plus配置了主题颜色&#xff0c;配置到了全局 http://t.csdn.cn/FhZYa …

【PyTorch】Pytorch基础第0章

本文参加新星计划人工智能(Pytorch)赛道&#xff1a;https://bbs.csdn.net/topics/613989052 这是目录PyTorch的简介PyTorch 构建深度学习模型的步骤搭建pytorch使用环境PyTorch的简介 PyTorch 是一个开源的机器学习框架&#xff0c;由 Facebook 的人工智能研究院&#xff08;…

面部表情识别2:Pytorch实现表情识别(含表情识别数据集和训练代码)

面部表情识别2&#xff1a;Pytorch实现表情识别(含表情识别数据集和训练代码) 目录 面部表情识别2&#xff1a;Pytorch实现表情识别(含表情识别数据集和训练代码) 1.面部表情识别方法 2.面部表情识别数据集 &#xff08;1&#xff09;表情识别数据集说明 &#xff08;2&…

蔬菜视觉分拣机器人的设计与实现(RoboWork参赛方案)

蔬菜视觉分拣机器人的设计与实现 文章目录蔬菜视觉分拣机器人的设计与实现1. 技术栈背景2. 整体设计3. 机械结构3.1 整体结构3.2 底座结构3.3 小臂结构3.4 大臂结构3.5 负载组件结构3.6 末端执行器结构4. 硬件部分4.1 视觉系统4.1.1 光源4.1.2 海康工业相机4.2 传送带系统4.2.1…

网络工程师必备知识点

作为网络工程师&#xff0c;您将负责设计、部署和维护计算机网络系统。这包括构建、配置和管理网络设备&#xff0c;如交换机、路由器、防火墙等&#xff0c;并确保网络系统能够高效地运行。您需要了解计算机网络的各个层次、协议、标准和技术&#xff0c;包括TCP/IP、DNS、HTT…

现在的00后,实在是太卷了

现在的小年轻真的卷得过分了。前段时间我们公司来了个00年的&#xff0c;工作没两年&#xff0c;跳槽到我们公司起薪18K&#xff0c;都快接近我了。后来才知道人家是个卷王&#xff0c;从早干到晚就差搬张床到工位睡觉了。 最近和他聊了一次天&#xff0c;原来这位小老弟家里条…

CPU平均负载高问题定位分析

一、Linux操作系统CPU平均负载 1.1什么是CPU平均负载 1.2 怎么查看平均负载数值 二、Linux操作系统CPU使用率和平均负载区别 CPU使用率和平均负载区别 三、阿里云Linux操作系统CPU压测环境准备 3.1 核心命令应用场景 3.2 模拟生产环境出现的多种问题环境准备 分析工具安…

我,30岁程序员被裁了,千万别干全栈

大家好&#xff0c;这里是程序员晚枫&#xff0c;今天是读者投稿。下面开始我们的正文。&#x1f447; 关注博主&#x1f449;程序员晚枫 很久了&#xff0c;今天给大家分享一下我从事程序员后&#xff0c;30岁被裁的经历&#xff0c;希望帮到有需要的人。 1、我被裁了 大家好…

某小公司面试记录

记录一次面试过程&#xff0c;还有一些笔试题&#xff0c;挺简单的&#xff0c;排序&#xff0c;去重&#xff0c;this指向&#xff0c;深浅拷贝&#xff0c;微任务的执行顺序&#xff0c;变量提升等。 ES6数组新增的方法 Array.from&#xff1a; 将两类对象转为真正的数组&am…

2月编程语言排行榜新鲜出炉,谁又摘得桂冠?

近日&#xff0c;TIOBE公布了2023年2月编程语言排行榜&#xff0c;本月各个语言表现如何&#xff1f;谁又摘得桂冠&#xff1f;一起来看看吧&#xff01; TIOBE 2月Top15编程语言&#xff1a; 详细榜单查看TIOBE官网 https://www.tiobe.com/tiobe-index/ 关注IT行业的小伙伴…

【Linux】冯.诺依曼体系结构与操作系统

环境&#xff1a;centos7.6&#xff0c;腾讯云服务器Linux文章都放在了专栏&#xff1a;【Linux】欢迎支持订阅&#x1f339;冯.诺依曼体系结构什么是冯诺依曼体系结构&#xff1f;我们如今的计算机比如笔记本&#xff0c;或者是服务器&#xff0c;基本上都遵循冯诺依曼体系结构…

基于HTML实现浪漫情人节表白代码(附源代码)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

Java每日一练(20230312)

目录 1. 两数之和 II ★ 2. 反转链表 ★★ 3. 二叉树的层序遍历 II ★★★ &#x1f31f; 每日一练刷题专栏 C/C 每日一练 ​专栏 Python 每日一练 专栏 Java 每日一练 专栏 1. 两数之和 II 给定一个已按照 非递减顺序排列 的整数数组 numbers &#xff0c;请你从数…

YOLOv7、YOLOv5改进之打印热力图可视化:适用于自定义模型,丰富实验数据

💡该教程为改进YOLO高阶指南,属于《芒果书》📚系列,包含大量的原创改进方式🚀 💡更多改进内容📚可以点击查看:YOLOv5改进、YOLOv7改进、YOLOv8改进、YOLOX改进原创目录 | 唐宇迪老师联袂推荐🏆 💡🚀🚀🚀内含改进源代码 按步骤操作运行改进后的代码即可�…

Python每日一练(20230309)

目录 1. 删除有序数组中的重复项 ★ 2. 二叉树的最小深度 ★★ 3. 只出现一次的数字 II ★★ &#x1f31f; 每日一练刷题专栏 C/C 每日一练 ​专栏 Python 每日一练 专栏 1. 删除有序数组中的重复项 给你一个有序数组 nums &#xff0c;请你原地删除重复出现的元素…