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…...
PX4飞控Telem2接口详解:除了连树莓派,还能怎么玩?(附QGC参数配置清单)
PX4飞控Telem2接口的进阶玩法:解锁隐藏功能的6种实战方案 在无人机开发领域,Pixhawk飞控的Telem2接口常被简单当作连接树莓派或Jetson的通信通道。但当我第一次测量到这个接口的VCC引脚居然能稳定输出5V/500mA时,一个大胆的想法浮现ÿ…...
如何快速掌握notepad--:国产跨平台文本编辑器的完整指南
如何快速掌握notepad--:国产跨平台文本编辑器的完整指南 【免费下载链接】notepad-- 一个支持windows/linux/mac的文本编辑器,目标是做中国人自己的编辑器,来自中国。 项目地址: https://gitcode.com/GitHub_Trending/no/notepad-- 引…...
告别重复造轮子:用快马AI一键生成Unity通用数据管理模块,提升开发效率
今天想和大家分享一个提升Unity开发效率的实用技巧——如何快速构建一个通用的游戏数据管理模块。这个模块可以帮我们告别重复造轮子的痛苦,把更多精力放在游戏核心玩法的开发上。 为什么需要通用数据管理模块 在Unity开发中,我们经常需要处理各种游戏数…...
如何通过系统性抗体研发服务加速创新药物开发?
一、为何现代抗体药物研发需要系统性技术支撑?抗体药物作为生物制药领域的核心组成部分,在肿瘤、自身免疫疾病、神经系统疾病等重大疾病治疗中展现出革命性潜力。然而,从靶点验证到临床候选分子确立的研发过程充满复杂挑战:抗体分…...
终极指南:掌握Mi-Create表盘设计工具的5个核心技巧
终极指南:掌握Mi-Create表盘设计工具的5个核心技巧 【免费下载链接】Mi-Create Unofficial watchface creator for Xiaomi wearables ~2021 and above 项目地址: https://gitcode.com/gh_mirrors/mi/Mi-Create 小米手表用户们,你是否厌倦了官方表…...
快手无水印下载深度解析:从技术原理到商业应用的完整方案
快手无水印下载深度解析:从技术原理到商业应用的完整方案 【免费下载链接】KS-Downloader 快手(KuaiShou)视频/图片下载工具;数据采集工具 项目地址: https://gitcode.com/gh_mirrors/ks/KS-Downloader 在短视频内容管理日…...
【AI智能体】Dify 实战:构建企业级自然语言SQL查询引擎
1. 从个人工具到企业级解决方案的跨越 第一次接触Dify的自然语言转SQL功能时,我被它的便捷性惊艳到了。只需要输入"显示上季度销售额最高的产品",系统就能自动生成正确的SQL语句。但当我尝试在团队中推广使用时,各种问题接踵而至&a…...
GIMP Resynthesizer完整教程:掌握纹理合成与图像修复的核心技术
GIMP Resynthesizer完整教程:掌握纹理合成与图像修复的核心技术 【免费下载链接】resynthesizer Suite of gimp plugins for texture synthesis 项目地址: https://gitcode.com/gh_mirrors/re/resynthesizer 当你面对一张需要修复的老照片,或者需…...
炉石传说自动化工具:从效率提升到策略优化的全栈解决方案
炉石传说自动化工具:从效率提升到策略优化的全栈解决方案 【免费下载链接】Hearthstone-Script Hearthstone script(炉石传说脚本) 项目地址: https://gitcode.com/gh_mirrors/he/Hearthstone-Script 问题引入:重构游戏体验…...
用Multisim复刻经典24秒篮球计时器:从555时钟到数码管显示的保姆级仿真教程
用Multisim复刻经典24秒篮球计时器:从555时钟到数码管显示的保姆级仿真教程 篮球比赛中那令人窒息的最后24秒倒计时,不仅是球员的决胜时刻,也是电子爱好者眼中完美的数字电路实践案例。本文将带你用Multisim从零搭建一个完整的24秒计时系统&a…...
