【C++】STL(七) set容器

  • 8. set容器
    • 8.1 简介
    • 8.2 构造和赋值
      • 例子
    • 8.3 大小和交换
      • 例子
    • 8.4 插入和删除
      • 例子
    • 8.5 查找和统计
      • 例子
    • 8.6 set和multiset区别
      • 例子
    • 8.7 pair对组创建 ----- 成对出现的数据,利用对组可以返回两个数据
      • 创建方式
        • 例子
    • 8.8 内置类型指定排序规则
      • (1) set容器默认排序规则从小到大,利用仿函数,可以改变排序规则。
        • 例子
      • (2) 自定义数据类型指定排序规则
        • 例子

8. set容器

8.1 简介

① set容器中所有元素在插入时自动被排序。

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

③ set容器与multiset容器区别:

set容器不允许容器中有重复的元素。
multiset容器允许容器中有重复的元素。

8.2 构造和赋值

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

② 构造函数:

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

③ 赋值函数:

set构造和赋值
    set& operator=(const set &st);   //重载等号操作符

④ set容器插入数据时用insert

set容器插入的数据会自动排序

例子

void Set_test01()
{
    set<int> s1;
    //set容器只有INSERT插入数据方式
    s1.insert(10);
    s1.insert(30);
    s1.insert(40);
    s1.insert(20);
    s1.insert(30);
    PrintSet(s1);   //set:①不允许插入相同元素;②所有元素再插入时会自动排序

    set<int> s2(s1);
    PrintSet(s2);

    set<int> s3;
    s3 = s2;
    PrintSet(s3);
}

在这里插入图片描述

8.3 大小和交换

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

② 函数原型:

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

例子

void Set_test02()
{
    set<int> s1;
    s1.insert(10);
    s1.insert(30);
    s1.insert(40);
    s1.insert(20);
    s1.insert(30);
    cout << "s1 : ";
    PrintSet(s1);

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

    set<int>s2;
    s2.insert(1);
    s2.insert(2);
    s2.insert(3);
    s2.insert(4);
    cout << "s2 : ";
    PrintSet(s2);

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

在这里插入图片描述

8.4 插入和删除

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

② 函数原型:

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

例子

void Set_test03()
{
    set<int> s1;
    s1.insert(10);
    s1.insert(30);
    s1.insert(20);
    s1.insert(40);
    s1.insert(60);
    s1.insert(50);
    PrintSet(s1);

    s1.erase(s1.begin());
    PrintSet(s1);

    s1.erase(30);//指定待删除的数据,set会将所有该值删除
    PrintSet(s1);

    s1.erase(s1.begin(),s1.end());
    PrintSet(s1);
}

在这里插入图片描述

8.5 查找和统计

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

② 函数原型:

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

例子

void Set_test04()
{
    set<int> s1;
    s1.insert(10);
    s1.insert(20);
    s1.insert(30);
    s1.insert(40);
    s1.insert(34);
    s1.insert(342);
    s1.insert(1);
    s1.insert(46);
    s1.insert(30);
    s1.insert(20);
    s1.insert(30);
    s1.insert(40);
    PrintSet(s1);

    set<int>::iterator pos = s1.find(30);//查找函数返回的是一个位置,使用迭代器接收
    if (pos!=s1.end())
    {
        cout << "找到元素" << *pos << endl;
    }
    else
    {
        cout << "未找到元素" << endl;
    }

    cout << "30一共有 " << s1.count(30) << " 个" << endl;  //对于set容器而言,不能插入重读数据,因此,统计函数只有0/1两种结果
}

在这里插入图片描述

8.6 set和multiset区别

① set和multiset区别:

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

② 如果不允许插入重复数据可以利用set

③ 如果需要插入重复数据利用mutiset

例子

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


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

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

在这里插入图片描述

8.7 pair对组创建 ----- 成对出现的数据,利用对组可以返回两个数据

创建方式

pair<type, type> p ( value1, value2 );
pair<type, type> p = make_pair( value1, value2 );
例子
void Set_test06()
{
    pair<string, int> p("lalalal", 18);
    cout << p.first << " " << p.second << endl;

    pair<string, int> p2 = make_pair("AAAAA", 30);
    cout << p2.first << " " << p2.second << endl; 
}

在这里插入图片描述

8.8 内置类型指定排序规则

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

例子
class MyCompare
{
public:
    bool operator()(int v1, int v2)
    {
        return v1 > v2;
    }
};
void Set_test07()
{
    set<int> s1;

    s1.insert(10);
    s1.insert(20);
    s1.insert(30);
    s1.insert(40);
    s1.insert(34);
    s1.insert(42);
    s1.insert(1);
    s1.insert(46);
    PrintSet(s1);

    //指定排序规则:从大到小排
    set<int, MyCompare> s2; //利用仿函数
    s2.insert(10);
    s2.insert(20);
    s2.insert(30);
    s2.insert(40);
    s2.insert(34);
    s2.insert(42);
    s2.insert(1);
    s2.insert(46);
    for (set<int, MyCompare>::iterator it = s2.begin(); it != s2.end(); it++)
    {
        cout << *it << " ";
    }
    cout << endl;
}

在这里插入图片描述

(2) 自定义数据类型指定排序规则

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

    string m_Name;
    int m_Age;
};
class MyCompare_Person
{
public:
    bool operator()(const Person &p1, const Person &p2)
    {
        return p1.m_Age > p2.m_Age; //按照年龄降序
    }
};
void Set_test08()
{
    //自定义数据类型都要指定排序规则
    set<Person, MyCompare_Person> s;

    Person p1("刘备", 23);
    Person p2("关羽", 27);
    Person p3("张飞", 25);
    Person p4("赵云", 21);

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

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

}

在这里插入图片描述

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

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

相关文章

Powershell应用

Powershell应用 帮助命令进程管理服务管理文件管理网络管理系统管理用户管理远程管理常见问题 字符串和文本处理脚本和模块其他常用命令返回值类型PowerShell调用C# 类库PowerShell使用WmiWQL测试工具 帮助命令 Get-Help 这个命令用于获取其他命令的帮助文档&#xff0c;例如 …

像SpringBoot一样使用Flask - 3.蓝图路由Blueprint

接上一篇文章《像SpringBoot一样使用Flask - 2.静态资源访问及模版》&#xff0c;我们看到测试的"controller"都写在了一起&#x1f914; 如何像Springboot一样划分出一个完整的controller&#xff0c;里面实现不同业务的包呢&#xff1f; 本篇引入Blueprint&#xf…

Qt教程 — 1.1 Linux下安装Qt

目录 1 下载Qt 1.1 官方下载 1.2 百度网盘下载 1.3 Linux虚拟机终端下载 2 Qt安装 3 安装相关依赖 4 测试安装 1 下载Qt 1.1 官方下载 通过官网下载对应版本&#xff0c;本文选择的版本为qt-opensource-linux-x64-5.12.12&#xff0c;Qt官方下载链接&#xff1a;htt…

Liunx文件系统和基础IO

文件系统和基础IO 基础IOc语言基础IO函数当前路径和标准流系统IO系统调用函数重定向FILE文件结构体 在谈缓存区问题理解文件系统初识inode 基础IO c语言基础IO函数 打开与关闭 FILE *fopen(char *filename, const char *mode);选项还可以是 r/w/a 意味着为可读可写打开。 2…

【CSS】 css 实现文字的渐变色

效果 实现 .text {position: absolute;left: 52px;top: 1px;width: 200px;height: 31px;font-family: YouSheBiaoTiHei;font-size: 24px;color: rgba(255, 255, 255, 0.8);line-height: 31px;text-shadow: 0px 0px 8px #000000;text-align: center;font-style: normal;transiti…

车载气象站比传统气象站的优势是什么

【TH-CZ5】车载气象站在灵活性、覆盖范围、实时监测、多功能性和成本效益等方面均优于传统气象站。这些优势使得车载气象站在气象监测、气象服务、灾害应急等领域具有广泛的应用前景。 车载气象站与传统气象站相比&#xff0c;具有显著的优势&#xff0c;主要体现在以下几个方…

内网渗透-跨域环境渗透-2

目录 内网渗透-跨域环境渗透-2 热土豆提权 Wimc连接执行命令 Responder 密码抓取 WPAD提权 提取域控的NTDS hash文件 内网渗透-跨域环境渗透-2 热土豆提权 这个是提升本地权限的&#xff0c;不是提域控&#xff01; 总结&#xff1a;Potato.exe -ip 需要提权的IP -disab…

Java+SpringBoot+Vue+MySQL:教育培训办公系统的全栈开发

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

系统设计学习(二)用户认证场景

一、常用鉴权方式 HTTP Basic Authentication (HTTP基本认证) session-cookie 1&#xff0c;服务器在接受客户端首次访问时在服务器端创建session&#xff0c;然后保存session(我们可以将session保存在内存中&#xff0c;也可以保存在redis中&#xff0c;推荐使用后者)&…

Idea 看不到本地 change

环境 idea IntelliJ IDEA 2023.3.3 (Community Edition) idea 升级后&#xff0c;看不到本地change了&#xff0c;去掉下面勾选即可。 解决&#xff1a;

python调用clickhouse

&#xff08;作者&#xff1a;陈玓玏&#xff09; 使用clickhouse-driver包&#xff0c;先通过pip install clickhouse-driver安装包&#xff0c;再通过以下代码执行sql。 from clickhouse_driver import Client client Client(host10.43.234.214, port9000, userclickhou…

【网络安全】手机不幸被远程监控,该如何破解,如何预防?

手机如果不幸被远程监控了&#xff0c;用三招就可以轻松破解&#xff0c;再用三招可以防范于未然。 三招可破解可解除手机被远程监控 1、恢复出厂设置 这一招是手机解决软件故障和系统故障的终极大招。只要点了恢复出厂设置&#xff0c;你手机里后装的各种APP全部将灰飞烟灭…

AMEYA360:稳先微汽车驱动芯片—智能高边开关WS7系列

近几年&#xff0c;新能源汽车高速发展&#xff0c;用车浪潮蔓延全球&#xff0c;我国新能源汽车占有量连续9年居全球前列&#xff0c;2023年全年市占率达37.7%&#xff0c;市场规模可观&#xff0c;并显现出以下特点&#xff1a;电车产品对比油车优势明显、消费者接受度高、市…

蓝桥杯算法错题记录-基础篇

文章目录 本文还在跟新&#xff0c;最新跟新时间3/11&#xff01;&#xff01;&#xff01; 格式一定要符合要求&#xff0c;&#xff08;输入&#xff0c;输出格式&#xff09;1. nextInt () next() nextLine() 的注意事项2 .数的幂 a^2等3.得到最大长度&#xff08;最大...&a…

【python pyinstaller库】pyinstaller介绍、安装、以及相关重点知识

PyInstaller是一个在Windows、GNU/Linux、macOS等平台下将Python程序冻结&#xff08;打包&#xff09;为独立可执行文件的工具, 用于在未安装Python的平台上执行Python编写的应用程序。 相比类似工具&#xff0c;它的主要优点是 PyInstaller 与 Python 3.7-3.10 一起工作&…

阿里又又发布了一个“AI神器”

阿里给“打工”朋友送上“节日礼物” 六一儿童节当天&#xff0c;阿里就给所有“打工”的大朋友送上了一份“节日礼物” 6月1日上午&#xff0c;阿里云发布了面向音视频内容的AI新品“通义听悟”&#xff0c;并正式公测 通义千问、通义听悟 这哥俩现在所处环境不同&#xff0…

Druid连接池经常性断链问题

前段时间有应用使用Druid连接池经常的提示断链报错&#xff0c;整个问题排查分析过程很有意思。这里将Druid连接池、数据库层以及负载均衡层的配置分析下&#xff0c;记录整个问题的分析过程&#xff0c;同时梳理下Druid连接池的配置和连接保活及回收机制。 1、问题背景 应用…

线程(thread)

目录 线程的基本特性 pthread库的主要函数 pthread_create pthread_join pthread_exit pthread_mutex_init pthread_mutex_lock 和 pthread_mutex_unlock pthread_cond_init pthread_cond_wait 和 pthread_cond_signal / pthread_cond_broadcast pthread_cond_destro…

探索Linux世界:基本指令(文件查看、时间相关、grep、打包压缩及相关知识)

今天继续介绍一些指令 文章目录 1.cat - 查看文件1.1输出重定向和追加重定向1.2指令echo 2.more 指令3.less - 逐页查看文本文件内容4.head- 显示文件开头部分内容5.tail - 显示文件末尾部分内容5.1输入重定向&#xff08;<&#xff09;5.2管道&#xff08;|&#xff09; 6.…

【C++从练气到飞升】03---构造函数和析构函数

&#x1f388;个人主页&#xff1a;库库的里昂 ✨收录专栏&#xff1a;C从练气到飞升 &#x1f389;鸟欲高飞先振翅&#xff0c;人求上进先读书。 目录 ⛳️推荐 一、类的6个默认成员函数 二、构造函数 1. 构造函数的概念 2. 构造函数的定义 3. 构造函数的特性 三、析构函…