set/multiset容器

1、set/multiset容器简介

在这里插入图片描述
但是 set 容器只有键值,在插入数据的时候会自动根据 键值 进行排序,所以不允许有相同的键值存在,也不能修改 set 容器元素值,会破坏 set 的数据结构。set 容器的迭代器是只读迭代器
在这里插入图片描述

2、set容器 API 操作

在这里插入图片描述
在这里插入图片描述

3、set 容器的使用

set容器中只能使用 insert 一个一个插入数据

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

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


void test01()
{
    set<int,MyCompare> s1;           //使用仿函数更改排序规则  
    s1.insert(30);                   //set容器只能使用 insert 一个一个插入数据,,因为要根据插入的数据进行排序,也没有 n个元素的拷贝构造,因为set中要求键值是不能重复的 
    s1.insert(10);
    s1.insert(20);
    s1.insert(20);
    s1.insert(40);
    printSetInt(s1);
}

在这里插入图片描述

4、更改 set 容器的排序规则(定义 set 容器时修改)

在这里插入图片描述
但是 set 函数的排序规则默认是按照从小到大,所以使用仿函数更改排序规则从 大到小

#include <iostream>
#include<set>
using namespace std;
//仿函数实质上是一个类,使用仿函数更改排序规则
class MyCompare
{
public:
    bool operator()(int v1, int v2)
    {
        return v1>v2;
    }
};
void printSetInt(set<int> &s)
{
    set<int>::iterator it;
    for(it=s.begin(); it!=s.end();it++)
    {
        cout<<*it<<" ";
    }
    cout<<endl;
}

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


void test01()
{
    set<int,MyCompare> s1;           //使用仿函数更改排序规则  
    s1.insert(30);                   //set容器只能使用 insert 一个一个插入数据,,因为要根据插入的数据进行排序,也没有 n个元素的拷贝构造,因为set中要求键值是不能重复的 
    s1.insert(10);
    s1.insert(20);
    s1.insert(20);
    s1.insert(40);
    printSetInt(s1);
}

在这里插入图片描述

5、如果 set 容器存放的是自定义类型,则需要更改排序规则

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


class Person
{
    friend class MyComparePerson;   //访问私有属性的仿函数作为该类的友元 
    friend ostream& operator<<(ostream &out, Person ob);   //类外函数访问私有属性作为该类的友元 
private:
    int num;
    string name;
    float score;
public:
    Person(){}
    Person(int num,string name, float score)
    {
        this->num = num;
        this->name = name;
        this->score = score;
    }
};

//cout<<(*it);    重载 cout<<(*it);    中的输出运算符 
ostream& operator<<(ostream &out, Person ob)
{
    out<<ob.num<<" "<<ob.name<<" "<<ob.score<<endl;
    return out;
}

class MyComparePerson      //仿函数更改排序规则 
{
public:
    bool operator()(Person ob1, Person ob2)    //仿函数更改排序规则 
    {
        return ob1.num < ob2.num;
    }
};
void printSetInt(set<Person,MyComparePerson>  &s)
{
    set<Person,MyComparePerson> ::iterator it;
    for(it=s.begin(); it!=s.end();it++)
    {
        cout<<(*it);                        //cout的是每一个对象,所以可以为 (*it).num<<(*it).name<<(*it).score,并且要将 void printSetInt(set<Person,MyComparePerson>  &s)设置为友元函数,但是这个涉及到函数关系,也不好设置,所以可以使用上面的重载输出运算符 
    }                                       //所以可以使用上面的重载输出运算符 
    cout<<endl;              
}
void test02()
{
    set<Person,MyComparePerson>  s1;
    s1.insert(Person(100,"lucy", 88.8f));
    s1.insert(Person(104,"bob", 99.8f));
    s1.insert(Person(103,"tom", 77.8f));
    s1.insert(Person(101,"德玛", 66.8f));
    s1.insert(Person(105,"寒冰", 55.8f));
    printSetInt(s1);
}
int main(int argc, char *argv[])
{
    test02();
    return 0;
}

在这里插入图片描述
对于cout的是每一个 person对象,所以可以为 (*it).num<<(*it).name<<(*it).score,并且要将 void printSetInt(set<Person,MyComparePerson> &s)设置为友元函数,但是这个涉及到函数的位置关系,也不好设置,所以最简单的是使用上面的重载输出运算符,将ostream& operator<<(ostream &out, Person ob)设置 person 类的 友元函数

6、set的find 和 count 函数

find 从前往后查找 键值,直到 容器末尾
count(key);//查找键key的元素个数 set容器的结果只能是0或1,因为键值是不可重复的

void test03()
{
    set<int> s1;
    s1.insert(10);
    s1.insert(30);
    s1.insert(50);
    s1.insert(70);
    s1.insert(90);
    printSetInt(s1);

    set<int>::const_iterator ret;    // find的返回值是一个迭代器,所以要申明这个容器的迭代器 
    ret = s1.find(50);
    if(ret != s1.end())
    {
        cout<<"找到的结果:"<<*ret<<endl;
    }

    //count(key);//查找键key的元素个数  set容器的结果只能是0或1
    cout<<s1.count(50)<<endl;
}

int main(int argc, char *argv[])
{
    test02();
    return 0;
}

在这里插入图片描述

7、set 的lower_bound、upper_bound、equal_range函数

equal_range函数可以同时 返回两个迭代器,兼具 lower_bound、upper_bound的功能
equal_range(keyElem);//返回容器中key与keyElem相等的上下限的两个迭代器
返回值类型为pair 对组
在这里插入图片描述

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


void test04()
{
    set<int> s1;
    s1.insert(10);
    s1.insert(30);
    s1.insert(50);
    s1.insert(70);
    s1.insert(90);
    printSetInt(s1);

    set<int>::const_iterator ret;
    //lower_bound(keyElem);//返回第一个key>=keyElem元素的迭代器。(下限)
    ret = s1.lower_bound(50);
    if(ret !=s1.end())
    {
        cout<<"下限为:"<<*ret<<endl;
    }
    //upper_bound(keyElem);//返回第一个key>keyElem元素的迭代器(上限)
    ret = s1.upper_bound(50);
    if(ret !=s1.end())
    {
        cout<<"上限为:"<<*ret<<endl;
    }
    //equal_range(keyElem);//返回容器中key与keyElem相等的上下限的两个迭代器
    //返回值类型为pair 对组
    pair< set<int>::const_iterator, set<int>::const_iterator> p;
    p = s1.equal_range(50);
    if(p.first  != s1.end())    //左值
    {
        cout<<"下限为:"<<*(p.first)<<endl;
    }
    if(p.second != s1.end())    //右值
    {
        cout<<"上限为:"<<*(p.second)<<endl;
    }
}

int main(int argc, char *argv[])
{
    test04();
    return 0;
}

在这里插入图片描述

7、注意事项

set和multiset 的头文件都是 set
set的键值是不可重复的,multiset 的键值是可重复的
其他都是一样的

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

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

相关文章

读懂AUTOSAR :DiagnosticLogAndTrace DLT(四)-- API解析

一、周期调用的函数&#xff1a;Dlt_TxFunction 根据参数DltGeneralTrafficShapingSupport&#xff0c;决定如何去发送DLT消息。如果为TRUE&#xff0c;那需要参考参数DltLogChannelTrafficShapingBandwidth为每个Log通道设置发送带宽&#xff1b;如果为FALSE&#xff0c;那么…

纯虚函数和抽象类

什么时候使用纯虚函数: 某些类,在现实角度和项目实现角度,都不需要实例化(不需要创建它的对象),这个类中定义的某些成员函数,只是为了提供一个形式上的借口,准备让子类来做具体化的实现,此时,这个方法就可以定义为"纯虚函数",包含纯虚函数的类,就称为抽象类. 纯虚函…

Java入坑之集合、流与序列化

一、集合 1.1集合定义 集合概念&#xff1a; 保存和盛装数据的容器&#xff0c;将许多元素组合成一个单一单元的容器对象。集合&#xff0c;可用于存储/检索/操作/传输/聚合数据集合框架&#xff1a; 表示和操作集合的体系&#xff0c;包括接口、实现类&#xff0c;集合框架的…

python真的如此好吗?

作为一名合格的&#xff08;准&#xff09;程序员&#xff0c;必做的一件事是关注编程语言的热度&#xff0c;编程榜代表了编程语言的市场占比变化&#xff0c;它的变化更预示着未来的科技风向和机会&#xff01; Python霸占榜首 只因它真的很强 Python&#xff0c;年龄可能比…

这篇文章价值很大:股票历史分时成交数据怎么简单获取?【干货】

文章目录前言一、准备二、使用步骤1.引入库2&#xff0c;使用这个API查询历史分时数据&#xff1a;3.查询完整历史分时数据4.其他查询方法参数格式&#xff1a;[(市场代码, 股票代码), ...]参数&#xff1a;市场代码, 股票代码, 文件名, 起始位置, 数量参数&#xff1a;市场代码…

MySQL-binlog+dump备份还原

目录 &#x1f341;binlog日志恢复 &#x1f342;binlog介绍 &#x1f342;Binlog的用途 &#x1f342;开启binary log功能 &#x1f342;配置binlog &#x1f341;mysqldump &#x1f342;数据库的导出 &#x1f342;数据库的导入 &#x1f341;mysqldumpbinlog &#x1f990;…

【Python_Scrapy学习笔记(一)】Scrapy框架简介

Scrapy框架简介 前言 Scrapy 框架是一个用 python 实现的为了爬取网站数据、提取数据的应用框架&#xff0c;使用 Twisted 异步网络库来处理网络通讯&#xff0c;可以高效的完成数据爬取。本文主要介绍 Scrapy 框架的构成与工作原理。 正文 1、Scrapy安装 Windows安装&…

引导程序、BIOS中断、检测内存容量、实模式切换到保护模式

初始化引导程序 基本概念 BIOS会将磁盘的第0个扇区(大小为512字节)&#xff0c;加载到0x7c00处。 引导程序负责操作系统的加载&#xff0c;主要用于为操作系统运行提供初始化环境&#xff0c;并运行加载操作系统。 BIOS只加载磁盘的第0个扇区(512字节)到内存中&#xff0c;次程…

笔记本电脑开不了机?3种解决方法

案例&#xff1a;笔记本电脑开不了机怎么办&#xff1f; 【我的笔记本电脑一直用得好好的&#xff0c;今天突然开不了机&#xff0c;尝试按了开机键很多次也没有解决。有人遇到过同样的问题吗&#xff1f;有没有解决的方法&#xff01;】 在日常生活中&#xff0c;我们经常会…

【计算机网络——计算机网络的概念,组成,功能和分类以及相关的性能指标,分层结构和协议,TCP/IP参考模型】

文章目录计算机网络体系结构计算机网络的概念、组成、功能和分类标准化工作及相关组织速率相关的性能指标时延、时延带宽积、PTT和利用率分层结构、协议、接口和服务OSI参考模型TCP IP参考模型计算机网络体系结构 计算机网络的概念、组成、功能和分类 计算机网络的概念 计算…

游戏内嵌社区服务开放,助力开发者提升玩家互动与留存

华为 HMS Core 游戏内嵌社区服务提供快速访问华为游戏中心论坛能力&#xff0c;支持玩家直接在游戏内浏览帖子和交流互动&#xff0c;助力开发者扩展内容生产和触达的场景。 一、为什么要游戏内嵌社区&#xff1f; 二、游戏内嵌社区的典型使用场景 1、游戏内打开论坛 您可以在…

【从零开始学Skynet】实战篇《球球大作战》(十三):场景代码设计(下)

1、主循环 《球球大作战》是一款服务端运算的游戏&#xff0c;一般会使用主循环程序结构&#xff0c;让服务端处理战斗逻辑。如下图所示&#xff0c;图中的balls和foods代表服务端的状态&#xff0c;在循环中执行“食物生成”“位置更新”和“碰撞检 测”等功能&#xff0c;从而…

商城系统开发方案分析

互联网的不断发展&#xff0c;电商行业已经成为了当前最重要的商业形式之一。商城系统的开发也因此而备受关注。商城系统的开发是针对B2C、B2B2C等多种商业模式&#xff0c;如用户熟知的SHOP、商派等一系列商城系统&#xff0c;将商品和服务进行在线销售的一个综合性平台。那么…

【C语言进阶:动态内存管理】常见的动态内存错误

本节重点内容&#xff1a; 对NULL指针的解引用操作对动态开辟空间的越界访问对非动态开辟内存使用free释放使用free释放一块动态开辟内存的一部分对同一块动态内存多次释放动态开辟内存忘记释放&#xff08;内存泄漏&#xff09;经典的笔试题⚡对NULL指针的解引用操作 ⚡对动态…

Linux基础命令-seq打印数字序列

Linux基础命令-sed流编辑器 前言 seq命令通常是用来打印一串有规律的数字&#xff0c;常与其他命令搭配使用&#xff0c;一起来看下它的用法。 一. 命令介绍 在doc文档中查看seq命令的含义 NAMEseq - print a sequence of numbers DESCRIPTIONPrint numbers from FIRST to…

李宏毅教程系列——增强学习

目录 0. 强化学习wiki 1. 介绍 2. Exploration vs Exploitation 探索与开发 3. 各类最优化方法 3.1 Brute force猛兽蛮力法&#xff08;暴力搜索&#xff09; 3.2 Value function estimation&#xff08;价值函数估计&#xff09; 3.2.1 Monte Carlo methods 蒙特卡洛方…

3年经验,面试测试岗只会功能测试开口要求18K,令我陷入沉思。

由于朋友临时有事&#xff0c; 所以今天我代替朋友进行一次面试&#xff0c;公司需要招聘一位自动化测试工程师&#xff0c;我以很认真负责的态度完成这个过程&#xff0c; 大概近30分钟。 主要是技术面试&#xff0c; 在近30分钟内&#xff0c; 我与被面试者是以交流学习的方式…

【Linux】通过网络版计算器来认识协议

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《学会Linux》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;再谈协议&…

腾讯云4核8G12M轻量服务器配置性能评测

腾讯云轻量4核8G12M服务器&#xff0c;之前是4核8G10M配置&#xff0c;现在公网带宽和月流量包整体升级&#xff0c;12M公网带宽下载速度可达1536KB/秒&#xff0c;系统盘为180GB SSD盘&#xff0c;每月2000GB免费流量&#xff0c;腾讯云百科来详细说下4核8G12M轻量应用服务器配…

AJAX | 拦截器、文件上传和下载

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; AJAX Ajax即Asynchronous Javascript And XML&#xff08;异步JavaScript和XML&#xff09;&#xff1b;Ajax技术网页应用能够快速地将增量更新呈现在用户界面上&…