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

STL容器之<multiset>

文章目录

    • 测试环境
    • multiset介绍
    • 头文件
    • 模块类定义
    • 对象构造
    • 初始化
    • 元素访问
    • 元素插入和删除
    • 元素查找
    • 容器大小
    • 迭代器
    • 其他函数

测试环境

系统:ubuntu 22.04.2 LTS 64位
gcc版本:11.3.0
编辑器:vsCode 1.76.2

multiset介绍

  1. 关联式容器。
  2. 元素是唯一的,即是值又是键。
  3. 元素不能直接修改,需要先删除在插入。
  4. 支持双向迭代器。
  5. 在插入、删除和搜索时间复杂度为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介绍头文件模块类定义对象构造初始化元素访问元素插入和删除元素查找容器大小迭代器其他函数测试环境 系统&#xff1a;ubuntu 22.04.2 LTS 64位 gcc版本&#xff1a;11.3.0 编辑器&#xff1a;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后躺平了&#xff0c;但是有一说一&#xff0c;该卷的还是卷。 这不&#xff0c;前段时间我们公司来了个00后&#xff0c;工作都没两年&#xff0c;跳槽到我们公司起薪18K&#xff0c;都快接近我了。后来才知道人家是个卷王&#xff0c;从早干到晚就差搬张床到工位睡觉了…...

Intel 处理器 macOS降级到Big Sur

1 创建可引导的 macOS 安装器 将移动硬盘作安装 Mac 操作系统的启动磁盘。 创建可引导安装器需要满足的条件 移动硬盘&#xff08;格式化为 Mac OS 扩展格式&#xff09;&#xff0c;至少有 14GB 可用空间已下载 macOS Big Sur的安装器 2 下载 macOS macOS Big Sur安装器会…...

【网络安全】记一次红队渗透实战项目

一、信息收集 信息收集非常重要&#xff0c;有了信息才能知道下一步该如何进行&#xff0c;接下来将用 nmap 来演示信息收集 1、nmap 扫描存活 IP 由于本项目环境是 nat 模式需要项目 IP 地址&#xff0c;扫描挖掘本地的 IP 地址信息&#xff1a; 本机 IP 为&#xff1a;192…...

异想天开!没有CPU的操作系统

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

ChatGPT背后的指令学习是什么?PSU最新首篇《指令学习》技术全面综述,详述指令学习关键问题

来源: 专知 任务语义可以用一组输入到输出的例子或一条文本指令来表示。传统的自然语言处理(NLP)机器学习方法主要依赖于大规模特定任务样本集的可用性。出现了两个问题: 首先&#xff0c;收集特定于任务的标记示例&#xff0c;不适用于任务可能太复杂或太昂贵而无法注释&#…...

【Python】《我的世界》简简单单就可以完成?OMG~(附教学)

文章目录前言一、准备二、运行及操作三.代码解读与自定义总结前言 《我的世界 Minecraft》大家应该都听说过&#xff0c;但你有没有想过自己写一个这样的游戏呢&#xff1f;太难、太复杂了&#xff1f;也许吧&#xff0c;但是不试一试你怎么知道能不能成呢&#xff1f; 国外有…...

【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 表达式&#xff0c;也可称为闭包&#xff0c;它是推动 Java 8 发布的最重要新特性。 Lambda 允许把函数作为一个方法的参数&#xff08;函数作为参数传递进方法中&#xff09;。 使用 Lambda 表达式可以使代码变的更加简洁紧凑。 1.1 通用定义 lambda 表达…...

JUnit5用户手册~并行执行

两种运行模式 SAME_THREAD&#xff1a;默认的&#xff0c;测试方法在同一个线程CONCURRENT&#xff1a;并行执行&#xff0c;除非有资源锁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ː/&#xff0c;类似 view) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建&#xff0c;并提供了一套声明式的、组件化的编程模型&#xff0c;帮助你高效地开发用户界面。无论是简单还是复杂的界面&#xff0c;…...

我给Chat GPT写了个记忆系统

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

哈希表题目:砖墙

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

【程序环境详解】

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

栈(Stack)

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

【计算机网络】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…...

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

docker详细操作--未完待续

docker介绍 docker官网: Docker&#xff1a;加速容器应用程序开发 harbor官网&#xff1a;Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台&#xff0c;用于将应用程序及其依赖项&#xff08;如库、运行时环…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...

JS设计模式(4):观察者模式

JS设计模式(4):观察者模式 一、引入 在开发中&#xff0c;我们经常会遇到这样的场景&#xff1a;一个对象的状态变化需要自动通知其他对象&#xff0c;比如&#xff1a; 电商平台中&#xff0c;商品库存变化时需要通知所有订阅该商品的用户&#xff1b;新闻网站中&#xff0…...

高分辨率图像合成归一化流扩展

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 1 摘要 我们提出了STARFlow&#xff0c;一种基于归一化流的可扩展生成模型&#xff0c;它在高分辨率图像合成方面取得了强大的性能。STARFlow的主要构建块是Transformer自回归流&#xff08;TARFlow&am…...