STL容器之<multimap>

这篇具有很好参考价值的文章主要介绍了STL容器之<multimap>。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

测试环境

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

multimap介绍

  1. 关联式容器。
  2. 每个元素都包含用于排序的键和对应的值。
  3. 键值是不要求唯一(map中键要求唯一),同一个键可以对应多个值。
  4. 支持双向迭代器。
  5. 在插入、删除和搜索时间复杂度为log(n)。
  6. 键不可以直接修改,需要先删除,再添加;值可以直接修改

头文件

#include <map>

模块类定义

template <typename _Key, typename _Tp, typename _Compare = std::less<_Key>,
	    typename _Alloc = std::allocator<std::pair<const _Key, _Tp> > >
    class multimap{};

_Key:表示存储的键数据类型
_Tp:表示存储的值的数据类型
_Compare:表示按照键的排序方式。
_Alloc:表示所存储分配器的类型,负责元素内存的分配和释放。可选参数,一般不使用。

对象构造

/*构造一个空的map对象*/
std::multimap<int,std::string> multiMap1;
/*构造map对象,默认升序排序*/
std::multimap<int,std::string> multiMap2;
/*拷贝构造函数*/
std::multimap<int,std::string> multiMap3(multiMap1);
/*移动构造函数*/
std::multimap<int,std::string> multiMap4(std::move(multiMap3));
/*初始化列表构造函数*/
std::multimap<int,std::string> multiMap5({{1,"a"},{2,"b"},{3,"c"},{4,"d"},{5,"e"}});
/*初始化列表构造函数,并按升序排序*/
std::multimap<int,std::string,std::greater<int> > multiMap6({{1,"a"},{2,"b"},{3,"c"},{4,"d"},{5,"e"}});
/*指定迭代器范围构造函数*/
std::multimap<int,std::string> multiMap7(multiMap5.begin(), ++multiMap5.begin());
/*指定迭代器并指定排序规则*/
std::multimap<int,std::string> multiMap8(multiMap5.begin(), ++multiMap5.begin(),std::less<int>());

初始化

/*使用初始化列表初始化*/
multiMap1 = {{1,"a"}, {1,"b"}, {2,"c"}, {3,"d"},{4,"m"}};

元素访问

不支持at()函数和下标运算符“[]”获取元素文章来源地址https://www.toymoban.com/news/detail-403829.html

元素插入和删除

函数 返回值 功能
clear() 清空所有元素
erase() 迭代器或删除元素数量 清除指定位置的一个元素、通过迭代器指定范围内的元素或通过键删除值
emplace() 键值对 插入元素。插入成功时第一个元素是指向新插入元素的迭代器,失败时第一个元素是指向以存在元素的迭代器,第二个元素表示插入结果,true成功,false失败。
emplace_hint() 迭代器 插入成功返回新插入元素的迭代器,插入失败时返回已存在元素的迭代器
insert() 键值对、迭代器、无 1)在指定位置插入1个元素。2)复制通过迭代器指定范围的元素。3)通过初始化列表插入元素。4)直接插入元素。
/*清空容器*/
multiMap1.clear();
/*直接构造或移动语句插入元素*/
auto ret = multiMap1.emplace(1,"hello");
std::cout << "key:"<<ret->first<<" value:"<<ret->second<<std::endl;
/*直接构造或移动语句在指定位置插入元素*/
auto ret1 = multiMap1.emplace_hint(multiMap1.begin(),1,"word");
std::cout << "key:"<<ret1->first<<" value:"<<ret1->second<<std::endl;
/*插入元素,返回键值对*/
multiMap1.insert({1,"ni hao!"});
multiMap1.insert(std::make_pair<int,std::string>(4,"four"));
/*插入元素,返回迭代器*/
multiMap1.insert(multiMap1.begin(),{0,"zero"});
multiMap1.insert(multiMap1.begin(),std::make_pair<int,std::string>(1,"first"));
/*初始化列表插入,无返回值*/
multiMap1.insert({{2,"two"},{3,"three"},{4,"four"}});
/*使用迭代器指定范围插入元素,无返回值*/
std::multimap<int,std::string> multiMap9{{5,"five"},{6,"six"}};
multiMap1.insert(multiMap9.begin(),multiMap9.end());
/*删除单个元素*/
auto ret2 = multiMap1.erase(multiMap1.begin());
std::cout << "ret2.first:"<<ret2->first<<" ret2.second:"<<ret2->second<<std::endl;
for (auto & item : multiMap1)
{
    std::cout<<"key:"<<item.first<<" value:"<<item.second<<std::endl;
}
/*删除指定范围的元素*/
auto ret3 = multiMap1.erase(multiMap1.begin(), ++multiMap1.begin());
std::cout << "ret3.first:"<<ret3->first<<" ret3.second:"<<ret3->second<<std::endl;
for (auto & item : multiMap1)
{
    std::cout<<"key:"<<item.first<<" value:"<<item.second<<std::endl;
}
/*根据键值删除元素*/
int iCount = multiMap1.erase(1);
std::cout << "iCount:"<<iCount<<std::endl;

元素查找

函数 返回值 功能
count() std::size_t 返回给定键对应元素的数量
find() 迭代器 查找指定键对应的第一个元素的位置,未找到则返回end()
lower_bound() 迭代器 查找第一个大于或等于给定键的第一个元素的位置,未找到则返回end()
upper_bound() 迭代器 查找第一个大于给定键的第一个元素元素的位置,未找到返回end()
equal_range() 迭代器 获取给定键的lower_bound和upper_bound
multiMapTest = {{1,10},{1,11},{4,12},{1,13},{5,14},{8,15},{7,16},{8,17},{9,18},{9,19}};  
/*判断容器中指定键对应的元素数量*/
std::cout << multiMapTest.count(1)<<std::endl;
/*查找指定键的元素所在的位置*/
int iCount = multiMapTest.count(1);
std::multimap<int,int>::iterator itrRet4 = multiMapTest.find(1);
std::cout << "find():"<<std::endl;
while(iCount--)
{
    std::cout << "key:"<<itrRet4->first<<" value:"<<itrRet4->second<<std::endl;
    itrRet4++;
}
/*查找第一个大于等于给定键的第一个元素的位置*/
std::multimap<int,int>::iterator itrRet5 = multiMapTest.lower_bound(1);
std::cout << "key:"<<itrRet5->first<<" value:"<<itrRet5->second<<std::endl;
/*查找第一个大于给定键的元素的位置*/
std::multimap<int,int>::iterator itrRet6 = multiMapTest.upper_bound(3);
std::cout << "key:"<<itrRet6->first<<" value:"<<itrRet6->second<<std::endl;
/*分别返回lower_bound和upper_bound*/
auto ret7 = multiMapTest.equal_range(1);
std::cout << "lower_bound key:"<<ret7.first->first<<" lower_bound value:"<<ret7.first->second<<std::endl;
std::cout << "upper_bound key:"<<ret7.second->first<<" upper_bound value:"<<ret7.second->second<<std::endl;

容器大小

函数 返回值 功能
size() std::size_t 获取当前容器中的元素数量
empty() bool 判断当前容器是否为空,为空返回true,否则返回false
max_size() std::size_t 返回容器的最大容量
multiMapTest = {{1,10},{1,11},{4,12},{4,13},{5,14},{8,15},{7,16},{8,17},{9,18},{9,19}};
/*判断元素的数量*/
std::cout<<multiMapTest.size()<<std::endl;
/*判断容器最大能容纳的元素的数量*/
std::cout<<multiMapTest.max_size()<<std::endl;
/*判断容器是否为空*/
std::cout<<std::boolalpha<<multiMapTest.empty()<<std::endl;

迭代器

类型 功能
iterator 正向访问迭代器。从前向后访问元素,可以读取也可以修改
const_iterator 常量正向访问迭代器。从前向后访问元素,只能读取不能修改
reverse_iterator 逆向访问迭代器。从后向前访问元素,可以读取也可以修改
const_reverse_iterator 常量逆向访问迭代器。从后向前访问元素,只能读取不能修改
函数 返回值 功能
begin() 正向访问迭代器 返回指向multimap对象首元素所在位置的迭代器
end() 正向访问迭代器 返回指向multimap对象末尾元素的下一个位置的迭代器
cbegin() 常量正向访问迭代器 返回指向multimap对象首元素所在位置的常量迭代器
cend() 常量正向访问迭代器 返回指向multimap对象末尾元素的下一个位置的迭代器
rbegin() 逆向访问迭代器 返回指向multimap对象末尾元素位置的迭代器
rend() 逆向访问迭代器 返回指向multimap对象首元素的前一个位置的迭代器
crbegin() 常量逆向访问迭代器 返回指向multimap对象末尾元素位置的常量迭代器
crend() 常量逆向访问迭代器 返回指向multimap对象首元素的前一个位置的常量迭代器
std::multimap<int,int>multiMapTest({{1,11},{1,11},{3,12},{3,13},{9,14},{6,15},{7,16},{6,17},{9,18},{10,19}});
/*正向随机访问迭代器,每个元素+10,并打印输出(1--21 1--21 3--22 3--23 6--25 6--27 7--26 9--24 9--28 10--29)*/
std::multimap<int,int>::iterator itr;
for (itr = multiMapTest.begin(); itr != multiMapTest.end(); itr++)
{
    /* 修改元素值每个元素+10 */
    itr->second += 10; 
    /* 访问元素 */
    std::cout <<"first:"<<itr->first<< " second:"<<itr->second<<std::endl;
}
std::cout<<std::endl;
/*常量正向随机访问迭代器,并打印输出(1--21 1--21 3--22 3--23 6--25 6--27 7--26 9--24 9--28 10--29)*/
std::multimap<int,int>::const_iterator cItr;
for (cItr = multiMapTest.cbegin(); cItr != multiMapTest.cend(); cItr++)
{
    /* 不允许修改值,编译报错 */
    //*cItr += 10; 
    /* 访问元素 */
    std::cout <<"first:"<<cItr->first<< " second:"<<cItr->second<<std::endl;
}
std::cout<<std::endl;
/*逆向随机访问迭代器,每个元素+100,并打印输出(10--129 9--128 9 --124 7--126 6--127 6--125 3--123 3--122 1--121 1--121)*/
std::multimap<int,int>::reverse_iterator rItr;
for (rItr= multiMapTest.rbegin(); rItr!= multiMapTest.rend(); rItr++)
{
    /* 修改元素值 */
    rItr->second += 100; 
    /* 访问元素 */
    std::cout <<"first:"<<rItr->first<< " second:"<<rItr->second<<std::endl;
}
std::cout<<std::endl;
/*常量逆向随机访问迭代器,并打印输出(10--129 9--128 9 --124 7--126 6--127 6--125 3--123 3--122 1--121 1--121)*/
std::multimap<int,int>::const_reverse_iterator crItr;
for (crItr= multiMapTest.crbegin(); crItr!= multiMapTest.crend(); crItr++)
{
    /* 不允许修改元素值, 编译报错 */
    //*crItr += 100; 
    /* 访问元素 */
    std::cout <<"first:"<<crItr->first<< " second:"<<crItr->second<<std::endl;
}
std::cout << std::endl;

其他函数

函数名 返回值 功能
swap() 交换两个容器的元素
/*交互两个容器元素的值,无返回值*/
std::multimap<int,int> multimapSwap1 = {{1,5},{2,4},{3,3},{3,2},{5,1}};
std::multimap<int,int> multimapSwap2 = {{6,1},{6,2},{8,3},{8,6},{9,8}};
/*方式1, multimapSwap1={{6,1},{6,2},{8,3},{8,6},{9,8}}, multimapSwap2={{1,5},{2,4},{3,3},{3,2},{5,1}}*/
multimapSwap1.swap(multimapSwap2);
std::cout << "multimapSwap1:"<<std::endl;
for (auto &item : multimapSwap1)
{
    std::cout<<"key:"<<item.first<<" value:"<<item.second<<std::endl;
}

std::cout << "multimapSwap2:"<<std::endl;
for (auto &item : multimapSwap2)
{
    std::cout<<"key:"<<item.first<<" value:"<<item.second<<std::endl;
}
/*mapSwap1={{1,5},{2,4},{3,3},{3,2},{5,1}}, multimapSwap2={{6,1},{6,2},{8,3},{8,6},{9,8}}*/
std::swap(multimapSwap1,multimapSwap2);
std::cout << "multimapSwap1:"<<std::endl;
for (auto &item : multimapSwap1)
{
    std::cout<<"key:"<<item.first<<" value:"<<item.second<<std::endl;
}

std::cout << "multimapSwap2:"<<std::endl;
for (auto &item : multimapSwap2)
{
    std::cout<<"key:"<<item.first<<" value:"<<item.second<<std::endl;
}

到了这里,关于STL容器之<multimap>的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 安装ubuntu22.04系统,GPU驱动,cuda,cudnn,python环境,pycharm

    需要准备一个u盘,需要 格式化 ,且内存不小于8g 1 下载ubuntu镜像 下载链接: https://cn.ubuntu.com/download/desktop 2下载rufus Rufus - 轻松创建 USB 启动盘 Rufus: Create bootable USB drives the easy way https://rufus.ie/zh/  准备好这两个之后 ​ ​ 配置好之后,点开始,然后基本下一步下一步就可以

    2024年01月24日
    浏览(66)
  • Ubuntu-base(20.04/22.04) armhf / aarch64移植记录

    根文件系统官网 进入如下图选择版本-进入release 版本下载界面-下载armhf/arm64文件。 在/home/zynq/linux/rootfs/下建立mount.sh 在/home/zynq/linux/rootfs/下建立unmount.sh 给两个文件赋权限 运行mount.sh 挂载文件系统 adduser 和useradd的区别: adduser 和useradd的区别:

    2024年02月11日
    浏览(66)
  • 服务器Ubuntu 22.04 64位安装 MySQL5.7

    官网地址 这里选择下载5.7.29的ubuntu版本注意是amd64不是arm64,或者执行下面命令 解压下载下来的包 ls一下看看有什么 我们先安装这个 然后再装下一个 喜闻乐见的报错,说我们没有安装红圈里的两个,我们去安装 好嘛,server依赖client,client又缺少libtinfo5,那就不能先装clien

    2024年02月06日
    浏览(60)
  • Ubuntu22.04安装Qt开发环境(包括VMware虚拟机、Ubtuntu系统以及QT的安装与卸载!)

    title: Ubuntu22.04安装Qt开发环境(包括安装与卸载!) date: 2023-8-6 sidebar: auto author: xiol(十六进制) tags: 学习 C++ Qt categories: Qt 🍓🍊在Ubuntu22.04下安装Qt🍭🍓🍬 最近单位的虚拟机越用越卡,打算重新安装一下环境,把遇到的问题以及解决办法详细记录一下。 1.1 确定安装好VMwar

    2024年01月23日
    浏览(62)
  • ubuntu-22.04.3-live-server-amd64安装详细过程

    一、ubuntu-22.04.3官方下载地址 1.打开网址地址:https://cn.ubuntu.com/download/alternative-downloads​​​​​​ 2.拖到网页下方,点击”Ubuntu 22.04.3 LTS 服务器版“ 3.先安装迅雷,然后点开点开下载的BT文件即可下载 二、使用VMware Workstation Pro创建虚拟机 1.VMware Workstation Pro实验演示的版本

    2024年02月04日
    浏览(43)
  • 【C++进阶04】STL中map、set、multimap、multiset的介绍及使用

    vector/list/deque… 这些容器统称为 序列式容器 因为其底层为线性序列的数据结构 里面存储的是元素本身 map/set… 这些容器统称为 关联式容器 关联式容器也是用来存储数据的 与序列式容器不同的是 其里面存储的是key, value结构的键值对 在数据检索时比序列式容器效率更高 “键

    2024年02月03日
    浏览(47)
  • Ubuntu 22.04 x86_64 源码编译 pytorch-v2.0.1 笔记

    cmake cuda Ubuntu 20.04 LTS 安装 nvidia 驱动 + cuda 11.8 从开始到放弃!_hkNaruto的博客-CSDN博客 地址 GitHub - pytorch/pytorch: Tensors and Dynamic neural networks in Python with strong GPU acceleration 解决 切换到git 源码目录重试 注意,调整下eigen地址 根据以往stable diffusion webui经验,采用conda创建python3.10.

    2024年02月16日
    浏览(49)
  • 环境搭建-Ubuntu20.04.6系统TensorFlow BenchMark的GPU测试

    登录阿里云官方镜像站:阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区 Server OS:Ubuntu 20.04.6 LTS Kernel: Linux 5.4.0-155-generic x86-64 Docker Version:24.0.5, build ced0996 docker-compose version:1.25.0 Docker OS:Ubuntu 20.04.5 LTS Nvidia GPU Version:NVIDIA-SMI 470.161.03 CUDA Version: 12.1 TensorFlow Version:1.15.

    2024年02月15日
    浏览(46)
  • nanopc t6 的ubuntu22.04用docker 安装openwrt 23.05.2,基于arm64 (aarch64)架构

    我是用nanopc t6的官方系统,rk3588-XYZ-ubuntu-jammy-x11-desktop-arm64-YYYYMMDD.img.gz,可以从官方的百度网盘下载,根据官方教材刷入nanopc t6中即可。官方网址如下: NanoPC-T6/zh - FriendlyELEC WiKi 毕竟刚刷的系统,先设置root密码 默认的账户和密码都是pi,我是自己添加了sudo用户,删除了pi用

    2024年01月17日
    浏览(69)
  • Ubuntu20.04_x86交叉编译aarch64版本的tslib1.22步骤

    编译环境:小米笔记本+Windows10+VMware17 +Ubuntu20.04虚拟机 编译目标:需要生成aarch64环境下对应的触摸屏驱动。 编译步骤: 1、下载aarch64-linux-gnu编译器,下载地址为:https://releases.linaro.org/components/toolchain/binaries/7.5-2019.12/aarch64-linux-gnu/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.x

    2024年02月16日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包