STL-set容器

news2025/2/26 13:51:21

set/multiset容器基本概念

所有元素都会根据元素的键值自动被排序。

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

set容器特点

set的元素不像map那样可以同时拥有实值和键值,set的元素即是键值又是实值。 set不允许两个元素有相同的键值。 不能通过set的迭代器改变set元素的值。因为set元素值就是其键值,关系到set元素的排序规则。如果任意改变set元素值,会严重破坏set组织。 set容器的迭代器为可读迭代器。

目录

set构造和赋值

set大小和交换

set插入和删除

set查找和统计

set和multiset区别

pair对组创建

set容器排序

set构造和赋值

构造:

set<T> st;                //默认构造函数:
set(const set &st);       //拷贝构造函数

赋值:

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

示例:

#include<iostream>
using namespace std;
#include<set>

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

//构造和赋值
void test01()
{
	set<int> s1;

	s1.insert(10);
	s1.insert(30);
	s1.insert(20);
	s1.insert(40);
	printSet(s1);

	//拷贝构造
	set<int>s2(s1);
	printSet(s2);

	//赋值
	set<int>s3;
	s3 = s2;
	printSet(s3);
}

int main() {

	test01();

	system("pause");

	return 0;
}

运行结果:

 

set大小和交换

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

示例主要代码:

//大小
void test01()
{

	set<int> s1;

	s1.insert(10);
	s1.insert(30);
	s1.insert(20);
	s1.insert(40);

	if (s1.empty())
	{
		cout << "s1为空" << endl;
	}
	else
	{
		cout << "s1不为空" << endl;
		cout << "s1的大小为: " << s1.size() << endl;
	}

}

//交换
void test02()
{
	set<int> s1;

	s1.insert(10);
	s1.insert(30);
	s1.insert(20);
	s1.insert(40);

	set<int> s2;

	s2.insert(100);
	s2.insert(300);
	s2.insert(200);
	s2.insert(400);

	cout << "交换前" << endl;
	printSet(s1);
	printSet(s2);
	cout << endl;

	cout << "交换后" << endl;
	s1.swap(s2);
	printSet(s1);
	printSet(s2);
}

运行结果:

set插入和删除

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

示例主要代码:

//插入和删除
void test01()
{
	set<int> s1;
	//插入
	s1.insert(10);
	s1.insert(30);
	s1.insert(20);
	s1.insert(40);
	printSet(s1);

	//删除
	s1.erase(s1.begin());
	printSet(s1);

	s1.erase(30);
	printSet(s1);

	//清空
	//s1.erase(s1.begin(), s1.end());
	s1.clear();
	printSet(s1);
}

运行结果:

 

set查找和统计

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

示例主要代码:

void test01()
{
	set<int> s1;
	//插入
	s1.insert(10);
	s1.insert(30);
	s1.insert(20);
	s1.insert(40);

	//查找
	set<int>::iterator pos = s1.find(30);

	if (pos != s1.end())
	{
		cout << "找到了元素 : " << *pos << endl;
	}
	else
	{
		cout << "未找到元素" << endl;
	}

	//统计
	int num = s1.count(30);
	cout << "num = " << num << endl;
}

运行结果:

 

set和multiset区别

         set不可以插入重复数据,而multiset可以
         set插入数据的同时会返回插入结果,表示插入是否成功
         multiset不会检测数据,因此可以插入重复数据

示例主要代码:

 

//set和multiset区别
void test01()
{
	set<int> s;
	pair<set<int>::iterator, bool>  ret = s.insert(10);
	if (ret.second) {
		cout << "第一次插入成功!" << endl;
	}
	else {
		cout << "第一次插入失败!" << endl;
	}

	ret = s.insert(10);
	if (ret.second) {
		cout << "第二次插入成功!" << endl;
	}
	else {
		cout << "第二次插入失败!" << endl;
	}

	//multiset
	multiset<int> ms;
	ms.insert(10);
	ms.insert(10);

	for (multiset<int>::iterator it = ms.begin(); it != ms.end(); it++) {
		cout << *it << " ";
	}
	cout << endl;
}

运行结果:

pair对组创建

        功能:成对出现的数据,利用对组可以返回两个数据

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

示例主要代码:

//对组创建
void test01()
{
	pair<string, int> p(string("Tom"), 20);
	cout << "姓名: " << p.first << " 年龄: " << p.second << endl;

	pair<string, int> p2 = make_pair("Jerry", 10);
	cout << "姓名: " << p2.first << " 年龄: " << p2.second << endl;
}

运行结果:

 

set容器排序

        set容器默认排序规则为从小到大,利用仿函数,可以改变排序规则

set存放内置数据类型时:

示例:

#include<iostream>
using namespace std;
#include<set>
class MyCompare
{
public:
	bool operator()(int v1, int v2)const {
		return v1 > v2;
	}
};
void test01()
{
	set<int> s1;
	s1.insert(10);
	s1.insert(40);
	s1.insert(20);
	s1.insert(30);
	s1.insert(50);

	//默认从小到大
	for (set<int>::iterator it = s1.begin(); it != s1.end(); it++) {
		cout << *it << " ";
	}
	cout << endl;

	//指定排序规则
	set<int, MyCompare> s2;
	s2.insert(10);
	s2.insert(40);
	s2.insert(20);
	s2.insert(30);
	s2.insert(50);

	for (set<int, MyCompare>::iterator it = s2.begin(); it != s2.end(); it++) {
		cout << *it << " ";
	}
	cout << endl;
}


int main() {

	test01();

	system("pause");

	return 0;
}

运行结果:

 set存放自定义数据类型时:

示例主要代码:

class Person
{
public:
	Person(string name, int age)
	{
		this->m_Name = name;
		this->m_Age = age;
	}

	string m_Name;
	int m_Age;

};
class comparePerson
{
public:
	bool operator()(const Person& p1, const Person& p2)const
	{
		//按照年龄进行排序  降序
		return p1.m_Age > p2.m_Age;
	}
};

void test01()
{
	set<Person, comparePerson> s;

	Person p1("小明", 23);
	Person p2("小李", 27);
	Person p3("小张", 33);
	Person p4("小刘", 21);

	s.insert(p1);
	s.insert(p2);
	s.insert(p3);
	s.insert(p4);

	for (set<Person, comparePerson>::iterator it = s.begin(); it != s.end(); it++)
	{
		cout << "姓名: " << it->m_Name << " 年龄: " << it->m_Age << endl;
	}
}

运行结果:

类似地,STL标准库中还提供有 map和 multimap这 2 个容器,它们也属于关联式容器。大家可以将他们对比联系学习。

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

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

相关文章

博客系统后端设计(四) - 实现获取博客详情页功能

文章目录 实现获取博客详情页功能约定前后端接口实现后端代码实现前端代码 实现获取博客详情页功能 在 博客列表页 点击 “查看全文” 按钮&#xff0c;就能跳转到博客详情页中。 跳转过去之后&#xff0c;在博客详情页中发起一个 ajax&#xff0c;从服务器获取到当前博客的具体…

【AI大模型】讯飞版大模型来了,现场发布四大行业应用成果

文章目录 前言SparkDesk讯飞星火认知大模型简介语言理解知识问答逻辑推理数学题解答代码理解与编写亲自体验写在最后前言 5月6日,讯飞星火认知大模型成果发布会在安徽合肥举行。科大讯飞董事长刘庆峰、研究院院长刘聪发布讯飞星火认知大模型,现场实测大模型七大核心能力,并…

和众视野加入飞桨技术伙伴计划,共同推动纺织行业智能化转型

近日&#xff0c;北京和众视野科技有限公司正式加入飞桨技术伙伴计划&#xff0c;双方将共同努力开发AI视觉检测技术和机器人流程自动化相结合的系统解决方案。 北京和众视野科技有限公司 北京和众视野是一家实验室检测仪器及解决方案供应商&#xff0c;一直专注于视觉检测和检…

我们在追求什么?以及我们将通往何方?记录AIGC共建者大会的一次演讲

‍‍ ​ 下一秒&#xff1a; 这个世界真如我们所见那样吗&#xff1f; 大家好&#xff0c;我是shadow。在特赞主办的AIGC创建者大会上&#xff0c;我分享了作为多重职业身份所从事的一些有意思的事情&#xff1a; 作为创作者&#xff0c;生成式人工智能展示了TA的才华&#xff…

【Fluent】XYplot中导出随着XYZ单一坐标变化的物理量规律

一、问题背景 之前我写的博客里&#xff0c;讲了如何导出区域内所有节点/单元格中心的XYZ三坐标&#xff0c;及其这个节点/单元格中心上存储的物理量信息。 但是有时候&#xff0c;我们有一个需求——只需要X、Y、Z坐标中的一个。 例如我们需要导出在某一条线上随X坐标变化的…

AICG,人工智能自动生成内容——根据文本生成图像,视频,音频

文章目录 1、什么是AICG&#xff1f;2、Text2Video3、Text2Image4、Text2Audio5、AICG的发展趋势 1、什么是AICG&#xff1f; 什么是AICG&#xff1f; AICG是指人工智能自动生成内容。通过算法模型&#xff0c;将文本转化为图像、音频、视频等多种形式。在数字时代&#xff0…

R语言 | 数据分析——统计绘图

目录 一、分类数据的图形描述 1.1 条形图barplot()函数 1.2 饼图pie()函数 二、量化数据的图形描述 2.1 点图与dotchart()函数 2.2 绘图函数plot() 2.2.1 绘制时间数列对象 ​2.2.2 向量数据与plot()函数 2.2.3 数据框数据与plot()函数 2.2.4 因子型数据与plot()函数 …

YARN 监控管理以资源管理

YARN的监控管理和资源管理 YARN WebUI V1服务JobHistoryServer服务配置 TimelineServer服务 YARN操作维护命令USER用户命令applicationjarapplicationattemptcontainerlogsqueuenodeversion Admin 管理命令resourcemanager | nodemanagerproxyserverdaemonlogrmadmintimelinese…

jenkins+springboot+gitee自动化部署项目

1、新建 maven项目我取名first 2、点击项目进行配置 3、源码管理配置 4、新建 stop.sh脚本 4、vim 编辑stop.sh脚本,build前停止jar #!/bin/bash # 获取jar包的pid pidps -ef | grep java | grep projectmonitor | awk {printf $2} if [ ! -z $pid ]; then kill -9 $pid …

Java面向对象三大特性封装和private关键字

目录 友情提醒一、Java面向对象的三大特性之封装1&#xff09;概念和好处2&#xff09;封装案例①访问权限修饰符&#xff08;private&#xff09;②构造方法与gette&setter方法③具体的封装案例 友情提醒 先看文章目录&#xff0c;大致了解知识点结构&#xff0c;直接点击…

苹果mac清理软件CleanMyMac X v4.13兼容13系统,堪称Mac最好的系统清理工具

CleanMyMac X for mac是MacOS上一款Mac清理优化工具&#xff0c;不仅包含各种清理功能&#xff0c;更是具有卸载器、维护、扩展、碎纸机这些实用功能&#xff0c;可以同时代替很多工具。它可以清理&#xff0c;优化&#xff0c;保养和监测您的电脑&#xff0c;确保您的Mac运行…

cleanmymac x 4.13新功能介绍,cleanmymac x怎么取消订阅

CleanMyMac X4.13版是一款运行在macOS系统中的专业清理软件&#xff0c;以安装方便、使用简易、功能完善等特点而闻名。CleanMyMac X在功能方面可以说是做到了极致&#xff0c;下面让我们看一下CleanMyMac X都包含有哪些功能。 CleanMyMac X是一款专业的Mac清理软件&#xff0c…

文件批量改名#批量修改文件名称中有特殊符号

在日常工作中&#xff0c;相信大家都会碰到&#xff0c;需要有修改文件名或文件夹名称等&#xff0c;修改方法也是很多种&#xff0c;如果遇到文件名有特殊符号&#xff0c;要如何把特殊符号删除或替换成自己需要的文字或其他表情符号呢。一般大家都是手动去修改&#xff0c;如…

安装和使用分布式HDFS系统在CentOS 8上进行文件上传操作

文章目录 实验目的和背景实验目的实验背景 实验过程步骤1&#xff1a;安装Java步骤2&#xff1a;下载hadoop-3.3.1.tar.gz步骤3&#xff1a;创建一个普通用户来运行Hadoop Hadoop 概念Hadoop 整体设计HDFSHDFS 的节点命名节点 (NameNode)数据节点 (DataNode)副命名节点 (Second…

语义分割学习笔记(四)膨胀卷积

推荐课程&#xff1a; 1.膨胀卷积_哔哩哔哩_bilibili&#xff08;膨胀卷积原理讲的很清楚&#xff09; 2.膨胀卷积(Dilated convolution)详解&#xff08;gradding effect问题和解决方法讲的很清楚&#xff09; 感谢博主霹雳吧啦Wz / 太阳花的小绿豆和Enzo_Mi提供视频讲解和源…

C++ OpenCV编译安装教程

文章目录 环境说明Cmake编译配置编译前配置编译选项开始正式编译安装 编写代码测试参考文章 环境说明 win10 MinGW64 Cmake 下载mingw64 (版本&#xff1a;12.1.0 posix-seh) 下载Cmake (版本3.17.5) 注&#xff1a;mingw64和cmake下载安装完成后记得把bin目录添加到【环境…

Video Grounding

一些工作能够检测包含特定动作的视频片段&#xff0c;一般称 为动作检测&#xff08;action detection&#xff09;或视频中的时序动作定位&#xff08;Temporal Action Grounding in Videos&#xff0c;TAGV&#xff09; 然而&#xff0c; TAGV 受限于预先定义的动作类别集合…

基于html+css的图展示57

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

母亲节:向世界上最伟大的母爱致敬

在这世间众多的亲情关系中&#xff0c;有一种关系无与伦比&#xff0c;毫不费力地凌驾于其他任何已知的地球关系之上。这种非凡的关系就是母亲与子女之间的关系。 母亲对家庭无尽的爱、奉献和忠诚使这份感情无价。为了向全球所有母亲表示敬意&#xff0c;母亲节在世界46个国家庆…

如何用ChatGPT拆解爆款内容(文章/脚本)、提出修改意见,再根据修改意见,最终成稿?

该场景对应的关键词库&#xff08;11个&#xff09;&#xff1a; 示例内容、爆款库、内容类型、拆解角度、亮点、不足、修改建议、文案、风格、文章、脚本 提问模板&#xff08;4个&#xff09;&#xff1a; 第一步&#xff1a;建立自己的爆款库&#xff0c;并选择其中1个爆款…