STL容器之<multiset>
文章目录
- 测试环境
- multiset介绍
- 头文件
- 模块类定义
- 对象构造
- 初始化
- 元素访问
- 元素插入和删除
- 元素查找
- 容器大小
- 迭代器
- 其他函数
测试环境
系统:ubuntu 22.04.2 LTS 64位
gcc版本:11.3.0
编辑器:vsCode 1.76.2
multiset介绍
- 关联式容器。
- 元素是唯一的,即是值又是键。
- 元素不能直接修改,需要先删除在插入。
- 支持双向迭代器。
- 在插入、删除和搜索时间复杂度为log(n)。
头文件
#include <set>
模块类定义
template <typename _Key, typename _Compare = std::less<_Key>, typename _Alloc = std::allocator<_Key> >class multiset{};
_Key:表示存储的键(值)数据类型
_Compare:表示按照键的排序方式。
_Alloc:表示所存储分配器的类型,负责元素内存的分配和释放。可选参数,一般不使用。
对象构造
/*默认构造函数*关联容器和容器适配器。*/
std::multiset<int> multiSet1;
/*构造一个set指定排序方式*/
std::multiset<int> multiSet2(std::less<int>());
/*拷贝构造函数*/
std::multiset<int> multiSet3(multiSet1);
/*移动构造函数*/
std::multiset<int> multiSet4(std::move(multiSet1));
/*初始化列表*/
std::multiset<int> multiSet5({5,4,3,2,1});
/*初始化列表+排序方式*/
std::multiset<int> multiSet6({5,4,3,2,1}, std::less<int>());
/*迭代器指定范围构造*/
std::multiset<int> multiSet7(multiSet6.begin(),multiSet6.end());
/*迭代器指定范围+排序方式*/
std::multiset<int> multiSet8(multiSet7.begin(), multiSet7.end(), std::less<int>());
初始化
/*初始化列表初始化元素*/
multiSet1 = {1,3,5,4,2};
元素访问
不支持at()函数和下标运算符访问元素
元素插入和删除
函数 | 返回值 | 功能 |
---|---|---|
clear() | 无 | 清空所有元素 |
erase() | 迭代器或删除元素数量 | 清除指定位置的一个元素、通过迭代器指定范围内的元素或通过键删除值 |
emplace() | 迭代器 | 直接构造一个元素并插入集合中。 |
emplace_hint() | 迭代器 | 在指定的位置插入元素。 |
insert() | 键值对、迭代器、无 | 1)直接插入一个元素。2)在指定位置插入1个元素。3)复制通过迭代器指定范围的元素。4)通过初始化列表插入元素。 |
multiSet1 = {2,2,3,1,1,5,6,6,2};
/*直接构造并插入元素*/
std::multiset<int>::iterator itr1 = multiSet1.emplace(10);
std::cout << "itr1 value is "<<*itr1<<std::endl;
/*直接构造元素并插入指定位置*/
std::multiset<int>::iterator itr2 = multiSet1.emplace_hint(++multiSet1.begin(),8);
std::cout << "itr2 value is "<<*(itr2)<<std::endl;
/*使用移动语句在指定位置插入元素*/
int iValue = 10;
std::multiset<int>::iterator itr3 = multiSet1.emplace_hint(++multiSet1.begin(),iValue);
std::cout << "itr3 value is "<<*(itr3)<<std::endl;
/*插入元素*/
std::multiset<int>::iterator itr4 = multiSet1.insert(8);
std::cout << "itr4 value is "<<*(itr4)<<std::endl;
/*使用移动函数插入元素,使用移动语句后iValue1不要再使用*/
int iValue1 = 7;
std::multiset<int>::iterator itr5 = multiSet1.insert(std::move(iValue1));
std::cout << "itr5 value is "<<*(itr5)<<std::endl;
/*指定位置插入元素*/
std::multiset<int>::iterator itr6 = multiSet1.insert(++multiSet1.begin(), 12);
std::cout << "itr6 value is "<<*(itr6)<<std::endl;
/*使用移动函数在指定位置插入元素*/
int iValue2 = 13;
std::multiset<int>::iterator itr7 = multiSet1.insert(--multiSet1.end(), std::move(iValue2));
std::cout << "itr7 value is "<<*(itr7)<<std::endl;
/*使用迭代器插入元素*/
multiSet1.insert(++multiSet5.begin(), --multiSet5.end());
/*使用初始化列表插入元素*/
multiSet1.insert({1,2,5,4,8,3});
/*按值删除元素*/
int iDelCnt = multiSet1.erase(2);
std::cout << "delete value count " << iDelCnt << std::endl;
/*删除指定位置的元素*/
std::multiset<int>::iterator itr8 = multiSet1.erase(++multiSet1.begin());
std::cout << "itr8 value is "<<*(itr8)<<std::endl;
/*删除指定范围的元素*/
std::multiset<int>::iterator itr9 = multiSet1.erase(++multiSet1.begin(), --multiSet1.end());
std::cout << "itr9 value is " << *(itr9) << std::endl;
/*清空元素*/
multiSet1.clear();
元素查找
函数 | 返回值 | 功能 |
---|---|---|
count() | std::size_t | 返回给定键对应元素的数量 |
find() | 迭代器 | 查找指定键对应元素的位置,未找到则返回end() |
lower_bound() | 迭代器 | 查找第一个大于或等于给定键的元素的位置,未找到则返回end() |
upper_bound() | 迭代器 | 查找第一个大于给定键的元素的位置,未找到返回end() |
equal_range() | 键值对 | 获取给定键的lower_bound和upper_bound,键值对的第一个元素表示lower_bound,第二个元素表示upper_bound |
multiSet1 = {1,1,2,2,3,4,5,6,6,8};
/*查找指定值的数量*/
std::cout << "count:" << multiSet1.count(2) << std::endl;
/*查找指定值的位置*/
std::multiset<int>::iterator itr10 = multiSet1.find(6);
std::cout << "itr10 value is " << *(itr10) << std::endl;
/*查找第一个大于等于给定键的元素的位置*/
std::multiset<int>::iterator itr11 = multiSet1.lower_bound(3);
std::cout << "itr11 value is "<<*(itr11)<<std::endl;
/*查找第一个大于给定键的元素的位置*/
std::multiset<int>::iterator itr12 = multiSet1.upper_bound(6);
std::cout << "itr12 value is "<<*(itr12)<<std::endl;
/*分别返回lower_bound和upper_bound*/
std::pair<std::multiset<int>::iterator, std::multiset<int>::iterator> pair = multiSet1.equal_range(1);
std::cout << "lower_bound value:"<<*(pair.first)<<std::endl;
std::cout << "upper_bound value:"<<*(pair.second)<<std::endl;
容器大小
函数 | 返回值 | 功能 |
---|---|---|
size() | std::size_t | 获取当前容器中的元素数量 |
empty() | bool | 判断当前容器是否为空,为空返回true,否则返回false |
max_size() | std::size_t | 返回容器的最大容量 |
/*判断元素的数量*/
std::cout<<"multiSet1 size is "<<multiSet1.size()<<std::endl;
/*判断容器最大能容纳的元素的数量*/
std::cout<< "multiSet1 max size is :" <<multiSet1.max_size()<<std::endl;
/*判断容器是否为空*/
std::cout<< "multiSet1 is empty ? " <<std::boolalpha<<multiSet1.empty()<<std::endl;
迭代器
类型 | 功能 |
---|---|
iterator | 正向访问迭代器。从前向后访问元素,可以读取也可以修改 |
const_iterator | 常量正向访问迭代器。从前向后访问元素,只能读取不能修改 |
reverse_iterator | 逆向访问迭代器。从后向前访问元素,可以读取也可以修改 |
const_reverse_iterator | 常量逆向访问迭代器。从后向前访问元素,只能读取不能修改 |
函数 | 返回值 | 功能 |
---|---|---|
begin() | 正向访问迭代器 | 返回指向set对象首元素所在位置的迭代器 |
end() | 正向访问迭代器 | 返回指向set对象末尾元素的下一个位置的迭代器 |
cbegin() | 常量正向访问迭代器 | 返回指向set对象首元素所在位置的常量迭代器 |
cend() | 常量正向访问迭代器 | 返回指向set对象末尾元素的下一个位置的迭代器 |
rbegin() | 逆向访问迭代器 | 返回指向set对象末尾元素位置的迭代器 |
rend() | 逆向访问迭代器 | 返回指向set对象首元素的前一个位置的迭代器 |
crbegin() | 常量逆向访问迭代器 | 返回指向set对象末尾元素位置的常量迭代器 |
crend() | 常量逆向访问迭代器 | 返回指向set对象首元素的前一个位置的常量迭代器 |
std::multiset<int> multisetTest({1,8,2,6,4,5,8,10,2,7});
/*正向随机访问迭代器,并打印输出(1 2 2 4 5 6 7 8 8 10)*/
std::set<int>::iterator itr;
for (itr = multisetTest.begin(); itr != multisetTest.end(); itr++)
{/* 不允许修改元素值 *///*itr += 10; /* 访问元素 */std::cout<<*(itr)<<" ";
}
std::cout<<std::endl;
/*常量正向随机访问迭代器,并打印输出(1 2 2 4 5 6 7 8 8 10)*/
std::set<int>::const_iterator cItr;
for (cItr = multisetTest.cbegin(); cItr != multisetTest.cend(); cItr++)
{/* 不允许修改值,编译报错 *///*cItr += 10; /* 访问元素 */std::cout <<*(cItr)<<" ";
}
std::cout<<std::endl;
/*逆向随机访问迭代器,并打印输出(10 8 8 7 6 5 4 2 2 1)*/
std::set<int>::reverse_iterator rItr;
for (rItr= multisetTest.rbegin(); rItr!= multisetTest.rend(); rItr++)
{/* 不允许修改元素值 *///*rItr += 100; /* 访问元素 */std::cout <<" " << *(rItr);
}
std::cout<<std::endl;/*常量逆向随机访问迭代器,并打印输出(10 8 8 7 6 5 4 2 2 1)*/
std::set<int>::const_reverse_iterator crItr;
for (crItr= multisetTest.crbegin(); crItr!= multisetTest.crend(); crItr++)
{/* 不允许修改元素值, 编译报错 *///*crItr += 100; /* 访问元素 */std::cout <<" "<<*crItr;
}
std::cout << std::endl;
其他函数
函数名 | 返回值 | 功能 |
---|---|---|
swap() | 无 | 交换两个容器的元素 |
/*交互两个容器元素的值,无返回值*/
std::multiset<int> multisetSwap1 = {1,2,3,4,3};
std::multiset<int> multisetSwap2 = {6,7,8,6,10};
/*方式1, multisetSwap1={6,6,7,8,10}, multisetSwap2={1,2,3,3,4}*/
multisetSwap1.swap(multisetSwap2);
std::cout << "multisetSwap1: " << std::endl;
for (auto & item : multisetSwap1)
{std::cout << " "<<item;
}
std::cout <<std::endl<< "multisetSwap2: " << std::endl;
for (auto & item : multisetSwap2)
{std::cout << " "<<item;
}
/*multisetSwap1={1,2,3,3,4}, multisetSwap2={6,6,7,8,10}*/
std::swap(multisetSwap1,multisetSwap2);
std::cout << std::endl <<"multisetSwap1: " << std::endl;
for (auto & item : multisetSwap1)
{std::cout << " "<<item;
}
std::cout << std::endl << "multisetSwap2: " << std::endl;
for (auto & item : multisetSwap2)
{std::cout << " "<<item;
}
相关文章:
STL容器之<multiset>
文章目录测试环境multiset介绍头文件模块类定义对象构造初始化元素访问元素插入和删除元素查找容器大小迭代器其他函数测试环境 系统:ubuntu 22.04.2 LTS 64位 gcc版本:11.3.0 编辑器:vsCode 1.76.2 multiset介绍 关联式容器。元素是唯一的…...
python实战应用讲解-【numpy专题篇】numpy常见函数使用示例(三)(附python示例代码)
目录 Python numpy.finfo()函数 Python Numpy MaskedArray.masked_less()函数 Python Numpy MaskedArray.masked_less_equal()函数 Python Numpy MaskedArray.masked_not_equal()函数 Python Numpy MaskedArray masked_outside()函数 Python Numpy MaskedArray.masked_wh…...
【Android笔记89】Android之全局加载框Gloading的使用
这篇文章,主要介绍Android之全局加载框Gloading的使用。 目录 一、Gloading全局加载框 1.1、Gloading介绍 1.2、Gloading运行效果 1.3、Gloading的使用...

php微信小程序java+Vue高校课程课后辅导在线教育系统nodejs+python
目 录 1绪论 1 1.1项目研究的背景 1 1.2开发意义 1 1.3项目研究现状及内容 5 1.4论文结构 5 2开发技术介绍 7 2.1 B/S架构 7 2.2 MySQL 介绍 7 2.3 MySQL环境配置 7 2.5微信小程序技术 8 3系统分析 9 3.1可行性分析 9 3.1.1技术可行性 9 3.1.2经济可行性 9 3.1.3操作可行性 10 …...

公司刚来的00后真卷,上班还没2年,跳到我们公司起薪20k....
都说00后躺平了,但是有一说一,该卷的还是卷。 这不,前段时间我们公司来了个00后,工作都没两年,跳槽到我们公司起薪18K,都快接近我了。后来才知道人家是个卷王,从早干到晚就差搬张床到工位睡觉了…...

Intel 处理器 macOS降级到Big Sur
1 创建可引导的 macOS 安装器 将移动硬盘作安装 Mac 操作系统的启动磁盘。 创建可引导安装器需要满足的条件 移动硬盘(格式化为 Mac OS 扩展格式),至少有 14GB 可用空间已下载 macOS Big Sur的安装器 2 下载 macOS macOS Big Sur安装器会…...

【网络安全】记一次红队渗透实战项目
一、信息收集 信息收集非常重要,有了信息才能知道下一步该如何进行,接下来将用 nmap 来演示信息收集 1、nmap 扫描存活 IP 由于本项目环境是 nat 模式需要项目 IP 地址,扫描挖掘本地的 IP 地址信息: 本机 IP 为:192…...

异想天开!没有CPU的操作系统
【引子】“The Last CPU”(https://doi.org/10.1145/3458336.3465291),ACM上的这一篇论文非常有趣,核心思想是如果计算机的体系结构中没有了CPU,那么,操作系统又会是怎样的呢?......不敢私藏&am…...

ChatGPT背后的指令学习是什么?PSU最新首篇《指令学习》技术全面综述,详述指令学习关键问题
来源: 专知 任务语义可以用一组输入到输出的例子或一条文本指令来表示。传统的自然语言处理(NLP)机器学习方法主要依赖于大规模特定任务样本集的可用性。出现了两个问题: 首先,收集特定于任务的标记示例,不适用于任务可能太复杂或太昂贵而无法注释&#…...

【Python】《我的世界》简简单单就可以完成?OMG~(附教学)
文章目录前言一、准备二、运行及操作三.代码解读与自定义总结前言 《我的世界 Minecraft》大家应该都听说过,但你有没有想过自己写一个这样的游戏呢?太难、太复杂了?也许吧,但是不试一试你怎么知道能不能成呢? 国外有…...

【SpringSecurity】认证授权框架——SpringSecurity使用方法
【SpringSecurity】认证授权框架——SpringSecurity使用方法 文章目录【SpringSecurity】认证授权框架——SpringSecurity使用方法1. 概述2. 准备工作2.1 引依赖2.2 测试3. 认证3.1 认证流程3.2 登录校验问题3.3 实现3.3.1 实现UserDetailsService接口3.3.2 密码存储和校验3.3.…...

java的Lambda表达式与方法引用详解
1. 定义 Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。 Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。 使用 Lambda 表达式可以使代码变的更加简洁紧凑。 1.1 通用定义 lambda 表达…...

JUnit5用户手册~并行执行
两种运行模式 SAME_THREAD:默认的,测试方法在同一个线程CONCURRENT:并行执行,除非有资源锁junit-platform.properties配置参数配置所有测试方法都并行 junit.jupiter.execution.parallel.enabled true junit.jupiter.execution.…...
【从零开始学习 UVM】3.3、UVM TestBench架构 —— UVM Environment [uvm_env]
文章目录 什么是UVM Environment?为什么验证组件不应该直接放置在test class中?创建UVM环境的步骤UVM环境示例Examples环境重用示例什么是UVM Environment? 一个UVM环境包含多个可重用的验证组件,并根据应用程序要求定义它们的默认配置。例如,一个UVM环境可能有多个agent…...

Vue的简单介绍
一、简介 Vue (发音为 /vjuː/,类似 view) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建,并提供了一套声明式的、组件化的编程模型,帮助你高效地开发用户界面。无论是简单还是复杂的界面,…...

我给Chat GPT写了个记忆系统
ChatGPT-LifeTime OpenAI 的模型有一个固定的 Token 限制,例如 GPT-3 的 Davinci 模型最多可以处理2049 个 Token,大约 1500 个英文单词。最新 Turbo 模型大约是 4,096 个 Token,大约是 3000 个英文单词,也就是意味着Chat GPT它会…...

哈希表题目:砖墙
文章目录题目标题和出处难度题目描述要求示例数据范围解法思路和算法代码复杂度分析题目 标题和出处 标题:砖墙 出处:554. 砖墙 难度 5 级 题目描述 要求 你的面前有一堵矩形的、由 n\texttt{n}n 行砖块组成的砖墙。这些砖块高度相同(…...

【程序环境详解】
每个源程序(.c文件)都需要经过编译链接形成 .exe的可执行文件。 在ANSI C的任何一种实现中,存在两个不同的环境 第一种是翻译环境,在这个环境中源代码被转换为可执行的机器指令。第二种是执行环境,它用于实际执行代码…...

栈(Stack)
目录 1.1 概念 1.2 栈的使用 1.3 栈的模拟实现 1.4 栈的应用场景 1. 改变元素的序列 2. 将递归转化为循环 1.1 概念 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为…...

【计算机网络】2、网络编程模型理论
文章目录一、网络基本概念1.1 网段1.2 子网掩码 netmask1.3 子网 subnet1.4 网络地址 network1.5 实战 192.168.0.1/27 的含义二、socket2.1 sockaddr 格式2.1.1 IPv4 sockaddr 格式2.1.2 IPv6 sockaddr 格式2.1.3 本地 sockaddr 格式2.2 http 与 websocket三、TCP 编程3.1 ser…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...

MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...

基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...

【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...
Docker拉取MySQL后数据库连接失败的解决方案
在使用Docker部署MySQL时,拉取并启动容器后,有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致,包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因,并提供解决方案。 一、确认MySQL容器的运行状态 …...

ubuntu22.04有线网络无法连接,图标也没了
今天突然无法有线网络无法连接任何设备,并且图标都没了 错误案例 往上一顿搜索,试了很多博客都不行,比如 Ubuntu22.04右上角网络图标消失 最后解决的办法 下载网卡驱动,重新安装 操作步骤 查看自己网卡的型号 lspci | gre…...