当前位置: 首页 > news >正文

c++ set/multiset 容器

1. set 基本概念

简介:

所有元素都会在插入时自动排序

本质:

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

set 和 multiset 区别:

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

2. set 构造和赋值

构造:

set<T> st; // 默认构造函数
set<T> st(const T& x); // 将x拷贝到st中

赋值:

set& operator=(const set& st); // 将st赋值给当前set	
#include <iostream>
#include <fstream>
#include <string>
#include <set>
using namespace std;//set 构造和赋值void printSet(const set<int>& s){for(set<int>::iterator it = s.begin(); it != s.end(); it++){cout << *it << " ";}cout << endl;
}void test01() {set<int> s1;// 插入数据只有insert一种方式s1.insert(10); // 插入元素s1.insert(30);s1.insert(60);s1.insert(20);s1.insert(20);// set容器的特点:所有元素都会在插入时自动被排序// set容器不允许插入重复数据printSet(s1);// 拷贝构造set<int> s2(s1);printSet(s2);// 赋值set<int> s3;s3 = s1;printSet(s3);
}int main(int argc, char const *argv[]) {test01();return 0;
}

3. set 大小和交换

功能描述:

统计set容器大小以及交换set 容器

函数原型

size(); // 返回set中元素的个数
empty(); // 判断set是否为空
swap(set<T> &s); // 交换sets
#include <iostream>
#include <fstream>
#include <string>
#include <set>
using namespace std;//set 大小和交换void printSet(const set<int>& s){for(set<int>::iterator it = s.begin(); it != s.end(); it++){cout << *it << " ";}cout << endl;
}// 大小
void test01() {set<int> s;s.insert(20);s.insert(10);s.insert(30);s.insert(40);printSet(s);// 判断是否为空if(s.empty()) {cout << "s is empty" << endl;}else{cout << "s is not empty" << endl;}cout << "s.size() = " << s.size() << endl;}// 交换
void test02() {set<int> s;s.insert(20);s.insert(10);s.insert(30);s.insert(40);set<int> s2;s2.insert(100);s2.insert(200);s2.insert(300);cout << "交换前:" << endl;printSet(s);printSet(s2);cout << "交换后:" << endl;s.swap(s2);printSet(s);printSet(s2);}int main(int argc, char const *argv[]) {test02();return 0;
}

4. set插入和删除操作

函数原型

void insert(const value_type& val); // 插入元素
clear(); // 清除所有元素
erase(iterator pos); // 删除pos位置的元素,返回下一个元素的迭代器
erase(iterator start, iterator end); // 删除从start到end之间的元素,返回下一个元素的迭代器
erase(const value_type& val); // 删除值为val元素,返回删除元素的个数
#include <iostream>
#include <fstream>
#include <string>
#include <set>
using namespace std;// set插入和删除操作void printSet(const set<int>& s){for(set<int>::iterator it = s.begin(); it != s.end(); it++){cout << *it << " ";}cout << endl;
}// 大小
void test01() {set<int> s;s.insert(20);s.insert(10);s.insert(30);s.insert(40);s.insert(50);s.insert(100);printSet(s);s.erase(s.begin());printSet(s);s.erase(++s.begin(), --s.end());printSet(s);s.erase(20);printSet(s);cout << "清空集合" << endl;s.clear();printSet(s);}int main(int argc, char const *argv[]) {test01();return 0;
}

5 set 查找和统计

函数原型:

find(const key_type& key); // 查找key是否存在,若存在,返回该元素的迭代器;若不存在,返回结束迭代器end()
count(const key_type& key); // 统计key的个数
#include <iostream>
#include <fstream>
#include <string>
#include <set>
using namespace std;// set 查找和统计
// 函数原型:// find(const key_type& key); // 查找key是否存在,若存在,返回该元素的迭代器;若不存在,返回结束迭代器end()
// count(const key_type& key); // 统计key的个数void printSet(const set<int>& s){for(set<int>::iterator it = s.begin(); it != s.end(); it++){cout << *it << " ";}cout << endl;
}// 大小
void test01() {set<int> s;s.insert(20);s.insert(10);s.insert(30);s.insert(40);s.insert(50);s.insert(100);set<int>::iterator it = s.find(50);if(it == s.end()){cout << "找不到" << endl;}else{cout << "找到了 " <<*it<< endl;}// 统计key的个数, 找到返回1,找不到返回0int count = s.count(10);cout << "count = " << count << endl;}int main(int argc, char const *argv[]) {test01();return 0;
}

6 set 和 multiset的区别

区别:

set不可以插入重复数据,而multiset可以
set插入数据同时会返回插入结果,表示插入是否成功
multiset 不会检测数据,因此可以插入重复数据
#include <iostream>
#include <fstream>
#include <string>
#include <set>
using namespace std;// set 和 multiset的区别void printSet(const set<int>& s){for(set<int>::iterator it = s.begin(); it != s.end(); it++){cout << *it << " ";}cout << endl;
}// 大小
void test01() {set<int> s;pair<set<int>::iterator,bool> ret =  s.insert(20);if(ret.second == true){cout << "第一次插入成功" << endl;}else{cout << "第一次插入失败" << endl;}ret = s.insert(20);if(ret.second == true){cout << "第二次插入成功" << endl;}else{cout << "第二次插入失败" << endl;}multiset<int> ms;// 允许重复插入ms.insert(20);ms.insert(20);ms.insert(20);ms.insert(20);ms.insert(20);for(multiset<int>::iterator it = ms.begin(); it != ms.end(); it++){cout << *it << " ";}cout << endl;
}int main(int argc, char const *argv[]) {test01();return 0;
}

7 pair对组创建

功能描述:

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

两种创建方式:

pair<int,int> p(value1,value2); // 创建一个pair对组,value1和value2分别对应pair的两个元素
pair<int,int> p = make_pair(value1,value2); // 创建一个pair对组,value1和value2分别对应pair的两个元素
#include <iostream>
#include <fstream>
#include <string>
#include <set>
using namespace std;// pair对组创建// 大小
void test01() {// 第一种创建方式pair<string, int> p1("西施", 20);cout << p1.first << " " << p1.second << endl;// 第二种创建方式pair<string, int> p2 = make_pair("貂蝉", 18);cout << p2.first << " " << p2.second << endl;}int main(int argc, char const *argv[]) {test01();return 0;
}

8 set 容器排序

目标:

set容器默认排序规制为从小到大,掌握如何改变排序规则

主要技术点:

利用防函数,可以改变排序规则
#include <iostream>
#include <fstream>
#include <string>
#include <set>
using namespace std;// set 容器排序void printSet(set<int> &s) {for(set<int>::iterator it = s.begin(); it != s.end(); it++) {cout << *it << " ";}cout << endl;
}class MyCompare {
public:bool operator()(int a,int b) const{// 比较逻辑return a > b;}
};// 
void test01() {set<int> s;s.insert(10);s.insert(30);s.insert(20);s.insert(40);s.insert(50);printSet(s);//指定排序规制,从大到小set<int,MyCompare> s2;s2.insert(10);s2.insert(30);s2.insert(20);s2.insert(40);s2.insert(50);for(set<int,MyCompare>::iterator it = s2.begin(); it != s2.end(); it++) {cout << *it << " ";}cout << endl;
}int main(int argc, char const *argv[]) {test01();return 0;
}
#include <iostream>
#include <fstream>
#include <string>
#include <set>
using namespace std;// set 容器排序
class Person {public:Person(string name, int age) {this->age = age;this->name = name;}string name;int age;
};class MyCompare {
public:// const 不能省bool operator()(const Person& a, const Person& b) const{// 比较逻辑return a.age < b.age;}
};void printSet(set<Person,MyCompare> &s) {for(set<Person,MyCompare>::iterator it = s.begin(); it != s.end(); it++) {cout << "name: " << it->name << " age: " << it->age << endl;}cout << endl;
}void test01() {//自定义数据类型,必须要指定排序规则set<Person, MyCompare> s;s.insert(Person("西施", 18));s.insert(Person("王昭君", 19));s.insert(Person("杨玉环", 17));s.insert(Person("貂蝉", 16));printSet(s);}int main(int argc, char const *argv[]) {test01();return 0;
}

相关文章:

c++ set/multiset 容器

1. set 基本概念 简介&#xff1a; 所有元素都会在插入时自动排序本质&#xff1a; set/multiset属于关联式容器&#xff0c;底层结构是用二叉树实现。set 和 multiset 区别&#xff1a; set容器不允许有重复的元素。 multiset允许有重复的元素。2. set 构造和赋值 构造&a…...

前部分知识复习02

一、物体的屏幕UV坐标 float2 ScreenUV i.pos.xy / _ScreenParams.xy; 二、抓取屏幕图像 GrabPass{" _A "} //_A为贴图图像名称 之后需在Pass中声明该贴图才能在Pass中引用此贴图 三、屏幕抓取并制作热效应代码 Shader"unity/HeatDistort 07" {Pr…...

开发环境搭建-3:配置 JavaScript 开发环境 (fnm+ nodejs + pnpm + nrm)

在 WSL 环境中配置&#xff1a;WSL2 (2.3.26.0) Oracle Linux 8.7 官方镜像 node 官网&#xff1a;https://nodejs.org/zh-cn/download 点击【下载】&#xff0c;选择想要的 node 版本、操作系统、node 版本管理器、npm包管理器 根据下面代码提示依次执行对应代码即可 基本概…...

kotlin内联函数——let,run,apply,also,with的区别

一、概述 为了帮助您根据使用场景选择合适的作用域函数&#xff08;scope function&#xff09;&#xff0c;我们将对它们进行详细描述并提供使用建议。从技术上讲&#xff0c;许多情况下范围函数是可以互换使用的&#xff0c;因此示例中展示了使用它们的约定俗成的做法。 1.…...

【深度学习|DenseNet-121】Densely Connected Convolutional Networks内部结构和参数设置

【深度学习|DenseNet-121】Densely Connected Convolutional Networks内部结构和参数设置 【深度学习|DenseNet-121】Densely Connected Convolutional Networks内部结构和参数设置 文章目录 【深度学习|DenseNet-121】Densely Connected Convolutional Networks内部结构和参数…...

数据结构与算法-要点整理

知识导图: 一、数据结构 包含:线性表(数组、队列、链表、栈)、散列表、树(二叉树、多路查找树)、图 1.线性表 数据之间就是“一对一“的逻辑关系。 线性表存储数据的实现方案有两种,分别是顺序存储结构和链式存储结构。 包含:数组、队列、链表、栈。 1.1 数组…...

Fort Firewall:全方位守护网络安全

Fort Firewall是一款专为 Windows 操作系统设计的开源防火墙工具&#xff0c;旨在为用户提供全面的网络安全保护。它基于 Windows 过滤平台&#xff08;WFP&#xff09;&#xff0c;能够与系统无缝集成&#xff0c;确保高效的网络流量管理和安全防护。该软件支持实时监控网络流…...

Nginx实战技巧(Practical Tips for nginx)

引言 简介 ‌Nginx&#xff08;发音为 "engine-x"&#xff09;是一个高性能的HTTP和反向代理服务器.‌ Nginx以其高并发处理能力、低资源消耗和灵活的配置而闻名&#xff0c;适用于高流量的Web服务器和应用程序。‌ Nginx的主要功能包括&#xff1a; ‌HTTP服务器…...

YOLOv8:目标检测与实时应用的前沿探索

随着深度学习和计算机视觉技术的迅速发展&#xff0c;目标检测&#xff08;Object Detection&#xff09;一直是研究热点。YOLO&#xff08;You Only Look Once&#xff09;系列模型作为业界广受关注的目标检测框架&#xff0c;凭借其高效、实时的特点&#xff0c;一直迭代更新…...

解锁数字经济新动能:探寻 Web3 核心价值

随着科技的快速发展&#xff0c;我们正迈入一个全新的数字时代&#xff0c;Web3作为这一时代的核心构成之一&#xff0c;正在为全球数字经济带来革命性的变革。本文将探讨Web3的核心价值&#xff0c;并如何推动数字经济的新动能。 Web3是什么&#xff1f; Web3&#xff0c;通常…...

Lua 环境的安装

1.安装Lua运行环境 本人采用的是在windows系统中使用cmd指令方式进行安装&#xff0c;安装指令如下&#xff1a; winget install "lua for windows" 也曾使用可执行程序安装过&#xff0c;但由于电脑是加密电脑&#xff0c;最后都已失败告终。使用此方式安装可以安…...

Object类(2)

大家好&#xff0c;今天我们继续来看看Object类中一些成员方法&#xff0c;这些方法在实际中有很大的用处&#xff0c;话不多说&#xff0c;来看。 注&#xff1a;所有类都默认继承Object类的&#xff0c;所以可调用Object类中的方法&#xff0c;如equals&#xff0c;也可以发生…...

汽车网络信息安全-ISO/SAE 21434解析(中)

目录 第七章-分布式网络安全活动 1. 供应商能力评估 2. 报价 3. 网络安全职责界定 第八章-持续的网络安全活动 1. 网路安全监控 2. 网络安全事件评估 3. 漏洞分析 4. 漏洞管理 第九章-概念阶段 1. 对象定义 2. 网路安全目标 3. 网络安全概念 第十章 - 产品开发 第十…...

fatal error C1083: ޷[特殊字符]ļ: openssl/opensslv.h: No such file or directory

一、环境 1. Visual Studio 2017 2. edk2&#xff1a;202305 3. Python&#xff1a;3.11.4 二、 fatal error C1083: ޷&#xbfab0;ļ: openssl/opensslv.h: No such file or directory 上图出现这个警告&#xff0c;不用管。 出现Done&#xff0c;说明编译成功。 执行上…...

C#System.Threading.Timer定时器意外回收注意事项

System.Threading.Timer定时器使用时会出现意外回收的情况。具体解释如下: 只要在使用 Timer,就必须保留对它的引用。对于任何托管对象,如果没有对 Timer 的引用,计时器会被垃圾回收。即使 Timer 仍处在活动状态,也会被回收。 实例对比测试 实例 定义两个类,其中一个…...

20.Word:小谢-病毒知识的科普文章❗【38】

目录 题目​ NO1.2.3文档格式 NO4.5 NO6.7目录/图表目录/书目 NO8.9.10 NO11索引 NO12.13.14 每一步操作完&#xff0c;确定之后记得保存最后所有操作完记得再次删除空行 题目 NO1.2.3文档格式 样式的应用 选中应用段落段落→开始→选择→→检查→应用一个一个应用ctr…...

vue3底层原理和性能优化

Vue 3 在底层原理和性能优化方面做了许多改进&#xff0c;以下是一些主要的优化点和原理&#xff1a; 1. 虚拟 DOM 的改进 静态树提升&#xff1a;Vue 3 能够检测到静态组件&#xff08;即不依赖响应式数据的组件&#xff09;并将其提升到渲染函数之外&#xff0c;从而减少不…...

Ubuntu介绍、与centos的区别、基于VMware安装Ubuntu Server 22.04、配置远程连接、安装jdk+Tomcat

目录 ?编辑 一、Ubuntu22.04介绍 二、Ubuntu与Centos的区别 三、基于VMware安装Ubuntu Server 22.04 下载 VMware安装 1.创建新的虚拟机 2.选择类型配置 3.虚拟机硬件兼容性 4.安装客户机操作系统 5.选择客户机操作系统 6.命名虚拟机 7.处理器配置 8.虚拟机内存…...

金融级分布式数据库如何优化?PawSQL发布OceanBase专项调优指南

前言 OceanBase数据库作为国产自主可控的分布式数据库&#xff0c;在金融、电商、政务等领域得到广泛应用&#xff0c;优化OceanBase数据库的查询性能变得愈发重要。PawSQL为OceanBase数据库提供了全方位的SQL性能优化支持&#xff0c;助力用户充分发挥OceanBase数据库的性能潜…...

springboot 动态线程池

在Spring Boot中&#xff0c;可以使用ThreadPoolTaskExecutor类来创建动态线程池。以下是一个示例&#xff1a; 首先&#xff0c;需要在配置文件中配置线程池的属性&#xff0c;例如最小线程数、最大线程数、线程存活时间等。可以在application.properties或application.yml中…...

ONNXRuntime GPU推理想用BFloat16加速?手把手教你搞定PyTorch + CUDA环境配置与避坑

ONNXRuntime GPU推理想用BFloat16加速&#xff1f;手把手教你搞定PyTorch CUDA环境配置与避坑 在深度学习模型部署领域&#xff0c;BFloat16数据类型正逐渐成为提升推理性能的新宠。这种16位浮点格式保留了与32位浮点相同的指数位&#xff0c;在保持数值范围的同时减少了内存占…...

从《西部世界》到现实:AI智能体如何重塑游戏NPC与虚拟社会?

从《西部世界》到现实&#xff1a;AI智能体如何重塑游戏NPC与虚拟社会&#xff1f; 当《西部世界》中的NPC开始拥有记忆、情感和自主决策能力时&#xff0c;观众惊叹于科幻与现实的边界正在模糊。如今&#xff0c;大型语言模型&#xff08;LLM&#xff09;驱动的AI智能体正将这…...

智能路由器项目解析:基于策略路由实现多线路流量智能调度

1. 项目概述&#xff1a;一个“聪明”的路由器能做什么&#xff1f;最近在GitHub上看到一个挺有意思的项目&#xff0c;叫smart-router&#xff0c;作者是c0nSpIc0uS7uRk3r。光看名字&#xff0c;你可能会觉得这又是一个关于家庭网络优化的工具&#xff0c;但点进去仔细研究后&…...

Kubernetes配置管理实战:基于Kustomize的结构化部署与多环境管理

1. 项目概述&#xff1a;一个被低估的Kubernetes配置管理利器如果你和我一样&#xff0c;长期在Kubernetes生态里摸爬滚打&#xff0c;那你一定经历过这样的场景&#xff1a;为了部署一个稍微复杂点的应用&#xff0c;需要维护一堆YAML文件——Deployment、Service、ConfigMap、…...

告别手动框选!用SUSTechPOINTS的V键批量标注,5分钟搞定一帧点云

解锁SUSTechPOINTS的V键批量标注&#xff1a;点云处理效率革命 在自动驾驶与机器人研发领域&#xff0c;点云标注是构建高精度感知模型的基础环节&#xff0c;但传统逐帧手动标注方式往往成为项目进度的瓶颈。我曾参与过一个城市级点云数据集标注项目&#xff0c;团队最初采用常…...

探索下一代命令行界面:OpenCLI 架构设计与插件化实践

1. 项目概述&#xff1a;一个面向未来的命令行界面原型最近在开源社区里&#xff0c;我注意到一个名为sys-fairy-eve/nightly-mvp-2026-03-19-opencli的项目。这个标题信息量不小&#xff0c;它不像一个成熟的产品&#xff0c;更像是一个开发过程中的里程碑快照。sys-fairy-eve…...

Nextra:基于Next.js的现代化文档站构建利器

1. 项目概述&#xff1a;为什么Nextra能成为文档站构建的“瑞士军刀”&#xff1f;如果你最近在寻找一个构建技术文档、博客或个人知识库的工具&#xff0c;大概率会听到“Nextra”这个名字。它不是一个独立框架&#xff0c;而是一个基于Next.js的静态站点生成器&#xff0c;专…...

嵌入式测试学习第 12天:串口基础概念:UART、波特率、数据位、校验位

串口基础概念&#xff1a;UART、波特率、数据位、校验位一、串口整体基础概念1、什么是UART串口2、串口实物真实图片① 主板/开发板排针串口② USB转TTL串口模块③ 老式DB9工业串口公头母头二、串口四大核心参数1、波特率概念常用标准固定值通俗理解测试场景2、数据位概念作用3…...

【STC8H】GPIO模式深度解析:从准双向到推挽,如何精准控制外设

1. STC8H的GPIO模式全景解析 第一次接触STC8H的GPIO配置时&#xff0c;我被那个神秘的PxM0和PxM1寄存器搞得晕头转向。直到有一次调试I2C通讯失败&#xff0c;才发现是开漏模式配置错误。这次教训让我明白&#xff0c;理解GPIO的四种工作模式&#xff0c;就像掌握不同武器的使用…...

终极指南:5分钟掌握League Akari英雄联盟工具箱的强大功能

终极指南&#xff1a;5分钟掌握League Akari英雄联盟工具箱的强大功能 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power &#x1f680;. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit League Akari是一款基于…...