C++基础知识(八:STL标准库 Map和multimap )

news2025/7/10 9:02:10

Map

C++ 标准模板库(STL)中的 map 容器是一种非常有用的关联容器,用于存储键值对(key-value pairs)。在 map 中,每个元素都由一个键和一个值组成,其中键是唯一的,而值则可以重复。

基本概念

  • 键与值:键用于唯一标识一个元素,而值则是与键关联的数据。键和值通常以 std::pair 的形式存储,但在大多数操作中,你可以直接使用键和值。
  • 排序map 中的元素会根据键的比较进行排序。默认情况下,键按照升序排列,但可以通过提供自定义的比较函数或比较对象来改变排序方式。
  • 查找效率:由于 map 内部通常使用红黑树实现,查找、插入和删除操作的时间复杂度为 O(log N),其中 N 是容器中的元素数量。

声明和初始化

Cpp

#include <map>
#include <string>
#include <iostream>

// 声明一个 map,键为 int 类型,值为 std::string 类型
std::map<int, std::string> myMap;

// 初始化 map
std::map<int, std::string> myMap = {
    {1, "apple"},
    {2, "banana"},
    {3, "cherry"}
};

插入元素

Cpp

myMap.insert({4, "date"}); // 使用 make_pair 或者直接初始化 pair
myMap[5] = "elderberry";   // 使用 [] 操作符,如果键不存在,会自动创建一个新的元素

访问元素

Cpp

std::string fruit = myMap[3]; // 获取键为3的值
fruit = myMap.at(3);           // 与[]类似,但会抛出异常如果键不存在

遍历 map

Cpp

for (const auto& element : myMap) {
    std::cout << element.first << ": " << element.second << std::endl;
}

或者使用迭代器:

Cpp

for (auto it = myMap.begin(); it != myMap.end(); ++it) {
    std::cout << it->first << ": " << it->second << std::endl;
}

可能遇到的错误:

1。C++版本不够

 查看一下自己的版本

我这个就是C++98,像auto这些都需要C++11以上的版本,升级版本大家可以自行搜索。

常用函数

  • find():查找键是否存在,返回指向键的迭代器或 end() 如果找不到。
  • count():返回键的数量,对于 map 总是返回 0 或 1。
  • erase():删除指定键的元素,可以接受键或迭代器作为参数。
  • empty():检查 map 是否为空。
  • size():返回 map 中的元素数量。
  • clear():删除 map 中的所有元素。

多值映射 multimap

multimap 是 C++ STL 中的一个关联容器,它类似于 map,但是它允许一个特定的键对应多个值。这意味着在 multimap 中,键可以不是唯一的,相同键的多个元素会被存储在一起,并且这些元素将根据它们的键按升序排序。

  1. 键值对存储multimap 存储键值对,其中键用于索引,值是与键相关联的数据。键和值分别定义为模板参数的类型。

  2. 键的非唯一性: 不同于 mapmultimap 允许有多个元素拥有相同的键。这意味着你可以存储多个与同一键关联的值。

  3. 自排序multimap 内部使用红黑树(一种自平衡的二叉搜索树)实现,这意味着元素会根据键的值自动排序。默认情况下,键按照升序排序,但你可以通过提供自定义的比较函数或比较对象来改变排序规则。

  4. 高效查找、插入和删除: 由于使用了红黑树结构,multimap 的查找、插入和删除操作的时间复杂度都是 O(log n),其中 n 是容器中的元素数。

  5. 迭代器稳定: 当使用 erase 函数删除一个元素时,不会影响其他元素的位置,因此指向未被删除元素的迭代器和引用仍然是有效的。

  6. 成员函数multimap 提供了一系列成员函数,如 inserterasefindcountequal_range 等,用于操作和查询容器。

  7. 大小和容量: 它提供了 sizeemptymax_size 成员函数,用于检查容器的当前大小、是否为空以及最大可能的大小。

  8. 迭代器和反向迭代器multimap 支持正向迭代器和反向迭代器,允许你遍历整个容器或反向遍历容器。

  9. 键值对的访问: 你可以使用 beginend 成员函数获得迭代器,然后通过迭代器访问键值对。multimap 不支持 operator[],因为键可能不是唯一的,但提供了 at 函数来访问键存在的元素,如果键不存在,at 将抛出 std::out_of_range 异常。

简单示例

#include <map>
#include <iostream>

using namespace std;

std::multimap<int, std::string> myMultimap;

int main(int argc, char const *argv[])
{

    myMultimap.insert(std::make_pair(1, "apple"));
    myMultimap.insert(std::make_pair(1, "orange"));

    auto it = myMultimap.find(1);
    auto range = myMultimap.equal_range(1);
	
	for (const auto &element : myMultimap)
    {
        std::cout << element.first << ": " << element.second << endl;
    }
	
	std::cout << "delete data" << std::endl;
	
    myMultimap.erase(myMultimap.begin()); // 删除第一个元素
    myMultimap.erase(1);                  // 删除所有键为1的元素

    for (const auto &element : myMultimap)
    {
        std::cout << element.first << ": " << element.second << endl;
    }
    return 0;
}

常用函数

  1. insert(const value_type& val)insert(value_type&& val): 向 multimap 插入一个元素。可以插入一个键值对,如果键已经存在,新值将被插入在现有相同键值对后面。

  2. insert(InputIterator first, InputIterator last): 插入从迭代器 firstlast 的一系列元素。

  3. insert(const_iterator hint, const value_type& val): 插入一个元素,并给出一个迭代器作为插入点的提示,但实际插入位置由键的顺序决定。

  4. erase(const key_type& k): 删除所有键为 k 的元素,返回被删除的元素数量。

  5. erase(iterator position): 删除由 position 指向的单个元素。

  6. erase(iterator first, iterator last): 删除由 [first, last) 范围内的所有元素。

  7. swap(multimap& x): 与另一个 multimap 交换内容。

  8. clear(): 清空 multimap,移除所有元素。

  9. find(const key_type& k): 返回指向第一个键为 k 的元素的迭代器,如果未找到则返回 end()

  10. count(const key_type& k): 返回键为 k 的元素数量。

  11. equal_range(const key_type& k): 返回键为 k 的所有元素的范围,返回一个包含两个迭代器的 std::pair,分别指向第一个和最后一个键为 k 的元素。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1822245.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

来自IEEE编委的发文建议及最佳实践

1.注意关键词(会涉及是否能找到合适的评审人) 2. Intro部分 contribution 通常3-4点 3. 注意文章中的符号使用前后统一 4.需要分析最终的结果(对之后的研究有什么帮助) 5.结论的部分 切忌虎头蛇尾,需要分析优点和缺点 建议未来的研究方向 6.参考文献

2001-2023年上市公司数字化转型测算数据(含原始数据+处理代码+计算结果)

2001-2023年上市公司数字化转型测算数据&#xff08;含原始数据处理代码计算结果&#xff09;&#xff08;吴非&#xff09; 1、时间&#xff1a;2001-2023年 2、来源&#xff1a;上市公司年报 3、指标:行业代码、行业名称、证券简称、是否发生ST或ST或PT、是否发生暂停上市…

max code size exceeded

Warning! Error encountered during contract execution [max code size exceeded] 智能合约编译时提示 contracts/core/CORE.sol:15:1: Warning: Contract code size exceeds 24576 bytes (a limit introduced in Spurious Dragon). This contract may not be deployable on m…

自研一套带双向认证的Android通用网络库

当前&#xff0c;许多网络库基于Retrofit或OkHttp开发&#xff0c;但实际项目中常需要定制化&#xff0c;并且需要添加类似双向认证等安全功能。这意味着每个项目都可能需要二次开发。那么&#xff0c;有没有一种通用的封装方式&#xff0c;可以满足大多数项目需求&#xff1f;…

什么是端口转发?路由器如何正确的设置端口转发和范围转发?(外网访问必备设置)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 端口转发 📒🚀 端口转发的应用场景💡 路由器如何设置端口转发(示例)💡 端口范围转发(示例)🎯 范围转发的应用场景🛠️ 设置范围转发📝 范围转发实操示例🎈 注意事项 🎈⚓️ 相关链接 ⚓️📖 介绍 📖 …

如何平衡安全访问和办公效率?零信任安全×统一身份才是解决之道

在远程办公、混合办公、跨团队协作日益频繁的今天&#xff0c;企业的业务开展需要支持多种访问接入的需求和场景。如何平衡企业数据的安全访问和办公效率将成为挑战。 在业务的多种接入场景上&#xff0c;企业引入零信任&#xff08;Zero Trust&#xff0c;ZT&#xff09;产品…

鸿蒙用 BuilderParam 实现同一个布局不同内容组件

面通过一个案例展示BuilderParam的具体用法&#xff0c;例如&#xff0c;现需要实现一个通用的卡片组件&#xff0c;如下图所示 卡片中显示的内容不固定&#xff0c;例如 具体实现代码如下&#xff1a; Entry Component struct BuildParamDemo {build() {Column(){Card() {imag…

aac如何转化mp3?超好用的四种音频转换方法!

aac如何转化mp3&#xff1f;AAC格式可能鲜为人知&#xff0c;但实际上它是一种音频文件格式&#xff0c;然而&#xff0c;AAC的应用却不太广泛&#xff0c;这并非偶然&#xff0c;首先&#xff0c;使用AAC需要支付专利费用&#xff0c;这对于个人和公司都可能是一笔不小的开支&…

【网络安全】【深度学习】【入侵检测】SDN模拟网络入侵攻击并检测,实时检测,深度学习【一】

文章目录 1. 前言2. Mininet 和 Ryu 的区别2.1 Mininet2.2 Ryu2.3 总结 3. 模拟攻击3.1 环境准备3.2 创建 Mininet 网络拓扑3.2 启动 Ryu 控制器3.3 模拟网络攻击3.4 捕获流量 4. 实时异常检测4.1 在 Ryu 控制器中4.2 在 h2 机器上的实验结果4.3 深度学习模型部署上h2机器 帮助…

Git保姆级教程

目录 Git是什么&#xff0c;为什么要学这个工具&#xff1f; 码云注册并创建仓库 Git安装 查看本地仓库状态 添加到暂存区 提交到本地库 修改文件 版本回退 创建、切换和删除分支 合并分支 克隆远端库到本地 将本地库推送到远端库 命令设置别名 Git是什么&#xf…

Qt 竖排文字研究(一)

在传统的编程环境中&#xff0c;代码的排列方式通常是水平的&#xff0c;这是基于我们日常的阅读习惯和编程规范。但是&#xff0c;当我们尝试打破这一常规&#xff0c;将代码字符以竖排的方式呈现时&#xff0c;发现没有什么现成有效的方式。所以本文基于Qt 的场景视图下&…

水表摄像直读抄表仪

1.技术性简述 水表摄像直读抄表仪&#xff0c;是一种前沿的智能计量机器设备&#xff0c;它利用超清摄像头部和图像识别算法&#xff0c;完成了远程控制、非接触的水表载入。这一技术的普及&#xff0c;颠覆了传统式人力抄表的形式&#xff0c;提高了效率&#xff0c;降低了不…

eclipse如何导入springboot项目

打开eclipse 找到你的springboot项目 点击finish即可 test02就已经导入进去了 配置一下maven 在将那个springboot项目刷新一下即可 运行成功

搭建 Redis 集群【Windows】

Redis 集群是一个分布式存储解决方案&#xff0c;它将数据分布在多个Redis节点上&#xff0c;以提高系统的可伸缩性、可靠性和性能。 1. 集群概念与特点 集群概念&#xff1a;Redis集群是由多个相互独立的 Redis 节点组成&#xff0c;这些节点通过高速网络互联&#xff0c;并作…

Java多线程-StampedLock(原子读写锁)

StampedLock 是读写锁的实现&#xff0c;对比 ReentrantReadWriteLock 主要不同是该锁不允许重入&#xff0c;多了乐观读的功能&#xff0c;使用上会更加复杂一些&#xff0c;但是具有更好的性能表现。StampedLock 的状态由版本和读写锁持有计数组成。 获取锁方法返回一个邮戳&…

源代码防泄密经验分享之安全上网篇

场景描述&#xff1a; 随着信息技术的发展&#xff0c;越来越多的新技术产品进入到政府、军事、科研等涉密单位。这些新技术产品在给工作人员带来便利的同时&#xff0c;也给信息安全保密工作带来了许多新的不容忽视的安全隐患&#xff0c;应引起高度重视。常规的内外网隔离手…

VSCode插件开发之初始化项目

VS code常见组件 在VS Code插件开发中&#xff0c;常用的组件有很多&#xff0c;这些组件可以帮助你实现各种功能和交互。以下是一些常见的组件&#xff1a; Extension API模块: 提供了许多类和方法&#xff0c;用于与VS Code编辑器进行交互&#xff0c;例如vscode.workspace用…

抽象语法树AST(Abstract Syntax Tree)

抽象语法树(Abstract Syntax Tree) 抽象语法树&#xff08;Abstract Syntax Tree&#xff0c;AST&#xff09;是源代码语法结构的一种抽象表示它以树状的形式表现编程语言的语法结构&#xff0c;树上的每个节点都表示源代码中的一种结构 抽象语法树用途 代码语法的检查、代码…

辣椒属2个T2T基因组-文献精读23

Two telomere-to-telomere gapless genomes reveal insights into Capsicum evolution and capsaicinoid biosynthesis 两个端粒到端粒无缝基因组揭示了辣椒进化和辣椒素生物合成的相关见解 摘要 辣椒&#xff08;Capsicum&#xff09;因其果实中含有辣椒素而闻名&#xff0c…

【SQL每日一练】获取北纬度(LAT_N)的中位数

文章目录 前言一、题析二、题解1.mysql2.sqlserver 前言 从 STATION 查询北纬度 &#xff08;LAT_N&#xff09; 的中位数&#xff0c;并将您的答案四舍五入到小数点后4位. 中位数的定义是&#xff1a;如果数据量是奇数&#xff0c;则中位数是排序后位于中间的数&#xff1b;如…