学会吊打面试官之map

news/2024/5/3 12:35:18/文章来源:https://blog.csdn.net/clayhell/article/details/129906741

小白:大牛,我最近学习了一些C++的STL容器,但是我还是有一些疑惑,特别是对于map,我不太理解它的底层实现和具体用法。能否跟我讲一下?

大牛:当然可以啊,map是一种非常常用的关联式容器,它的底层实现是基于红黑树的,用于存储键-值对(key-value pair)。相比于其他容器,map的主要特点是键值对的唯一性和按照键排序,让我们来看一个具体例子:

#include <iostream>
#include <map>
#include <string>int main() {std::map<std::string, int> myMap;myMap.insert({"Alice", 23});myMap.insert({"Bob", 19});myMap.insert({"Charlie", 45});std::cout << "Charlie's age is " << myMap["Charlie"] << std::endl;for (auto& pair : myMap) {std::cout << pair.first << " is " << pair.second << " years old." << std::endl;}return 0;
}

这个例子中,我们创建了一个map,键是字符串类型,值是整型。然后我们插入了三个键值对,分别是“Alice”对应23,“Bob”对应19和“Charlie”对应45。注意,我们是用insert函数来插入键值对的。

接着,我们输出了“Charlie”对应的值,也就是45。

最后,我们用for循环输出了每一个键值对,这里用到了auto& pair来遍历map。

小白:我明白了,那如果我们想要查找一个键值对是否存在,应该怎么做呢?

大牛:很简单,你可以使用count函数来查找键值对的数量,如果存在,那么数量就是1,否则是0。另外,你也可以使用find函数来查找一个键,如果存在,那么find函数返回一个指向该键值对的迭代器,否则返回map的end迭代器。

#include <iostream>
#include <map>
#include <string>int main() {std::map<std::string, int> myMap;myMap.insert({"Alice", 23});myMap.insert({"Bob", 19});myMap.insert({"Charlie", 45});if (myMap.count("Bob") > 0) {std::cout << "Bob exists in myMap." << std::endl;} else {std::cout << "Bob does not exist in myMap." << std::endl;}auto it = myMap.find("Alice");if (it != myMap.end()) {std::cout << "Alice's age is " << it->second << std::endl;} else {std::cout << "Alice does not exist in myMap." << std::endl;}return 0;
}

大牛:好的,我们现在来看一下如何使用map进行查找操作。首先,我们需要创建一个map对象,并向其中插入一些数据:

#include <iostream>
#include <map>using namespace std;int main() {// 创建一个map对象,key为string类型,value为int类型map<string, int> myMap;// 向map中插入数据myMap["apple"] = 10;myMap["banana"] = 20;myMap["orange"] = 30;// 查找key为"apple"的元素map<string, int>::iterator iter = myMap.find("apple");if(iter != myMap.end()) {cout << "找到了,值为:" << iter->second << endl;} else {cout << "没找到!" << endl;}// 查找key为"pear"的元素iter = myMap.find("pear");if(iter != myMap.end()) {cout << "找到了,值为:" << iter->second << endl;} else {cout << "没找到!" << endl;}return 0;
}

这里我们用map对象myMap存储了三组键值对,然后分别查找了键为"apple"和"pear"的元素。可以看到,第一次查找返回了正确的结果,而第二次查找则返回了"没找到"。

小白:原来如此,这样使用map确实很方便啊!那么,map的底层实现是什么呢?

大牛:map的底层实现通常是使用红黑树(Red-Black Tree)来实现的。红黑树是一种自平衡二叉查找树,它的结构非常灵活,可以自动保持树的平衡状态,从而保证了查找、插入、删除等操作的时间复杂度都是O(logN)级别的。

小白:原来这就是所谓的“平衡树”啊,好厉害啊!

小白: 那我现在可以尝试用map来实现这个功能吗?

大牛: 当然可以,map就是专门用来处理键值对的容器。在这个例子中,你可以用学生的名字作为键,用他们的成绩作为值。这样就可以很方便地查找每个学生的成绩了。

小白: 那具体怎么实现呢?

大牛: 首先你需要定义一个map对象,并指定它的键和值的类型。代码应该像这样:

#include <map>
#include <string>std::map<std::string, int> student_scores;

这个代码定义了一个名为student_scores的map对象,它的键的类型是std::string,值的类型是int。

接下来,你可以用insert()函数向map中添加数据:

student_scores.insert(std::make_pair("Tom", 90));
student_scores.insert(std::make_pair("Jerry", 80));

这个代码将"Tom"和"Jerry"两个学生的成绩分别插入到了map对象中。

现在,你可以用find()函数来查找某个学生的成绩了:

std::map<std::string, int>::iterator it = student_scores.find("Tom");
if (it != student_scores.end()) {std::cout << "Tom's score is " << it->second << std::endl;
} else {std::cout << "Tom is not found" << std::endl;
}

这个代码查找了名为"Tom"的学生的成绩,并将结果输出到控制台上。如果没找到,它就会输出一条错误信息。

小白: 好像很方便啊,map就是处理键值对最好的容器了。

大牛: 是的,map是一个非常强大的容器,它可以帮助你高效地存储和查找键值对数据。在实际开发中,我们会经常使用到它。

大牛:接下来我们看一下如何遍历map,即访问map中的所有元素。你可以使用迭代器进行遍历,例如:

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

小白:这里使用了auto关键字,我想请问它是什么?

大牛:auto是C++11引入的关键字,它能够根据初始化的表达式来推断变量的类型。在上述代码中,auto会被推断为std::map<int, std::string>::iterator类型。

小白:哦,我懂了。那我可以使用range-based for loop来遍历map吗?

大牛:当然可以,range-based for loop非常适合遍历容器,让代码更加简洁易读。你可以这样使用:

for (const auto& pair : myMap) {std::cout << pair.first << " => " << pair.second << '\n';
}

小白:这段代码真的很简洁!那如果我想要查找map中是否存在某个key,应该怎么做呢?

大牛:可以使用map的find函数来查找。find函数接受一个key值,返回一个指向该key-value对的迭代器。如果map中不存在该key,则返回end()迭代器。下面是一个例子:

auto it = myMap.find(2);
if (it != myMap.end()) {std::cout << "The value of key 2 is " << it->second << '\n';
} else {std::cout << "Key 2 not found\n";
}

小白:嗯,我懂了。谢谢你的讲解!

大牛:不用谢,任何问题都可以问我。

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小企业选择什么样的CRM系统比较合适,有什么特点?

CRM客户管理系统已经成为各种规模的企业&#xff0c;特别是小型企业的重要工具。CRM系统帮助小型企业更有效地管理客户数据和互动&#xff0c;简化销售流程&#xff0c;并提高客户满意度。市场上有如此多的选择&#xff0c;小企业该如何选择合适的CRM系统&#xff1f; 什么是C…

深圳CPDA|如何着手商业数据分析?

商业数据分析是一项非常重要的工作&#xff0c;可以帮助企业做出更明智的决策。 下面是一些着手商业数据分析的步骤&#xff1a; 1.确定你的问题 首先需要明确你想要解决什么问题。 这通常需要与业务团队沟通&#xff0c;以便了解他们正在寻找哪些信息。 2.收集数据 收集数…

linux语言学习记录

文章目录前言一、linux文件结构二、指令三、Gvim编辑器1、命令模式2、底行命令四、正则表达式1、表达式匹配举例2、对文件里面内容进行操作3、使用 \( 和 )\ 符号括起正规表达式&#xff0c;即可在后面使用\1和\2等变量来访问和中的内容前言 记录自己学习linux的笔记&#xff…

IFPUG功能点度量5:计算功能规模

功能点计数类型&#xff1a;开发项目、升级项目、应用 一、 三种功能能规模计算&#xff1a; 1、开发项目计算 DFP&#xff08;开发项目功能规模&#xff09;ADD&#xff08;交付用户的功能规模&#xff09;CFP&#xff08;转换功能的功能规模&#xff09; 2、升级项目计算 …

【代码笔记】Pytorch学习 DataLoader模块详解

Pytorch DataLoader模块详解dataloader整体结构DataLoaderinit 初始化参数解释代码解析IterableDataset 判断构建Sampler&#xff0c;单样本构建BatchSampler&#xff0c;组建batch构建collate_fn 对获取的batch进行处理其他的一些逻辑判断_get_iterator代码解析multiprocessin…

【Python】轻松掌握基础语法(一)

文章目录常量和表达式变量和类型变量的定义变量的使用变量的类型intfloatstrbool动态类型注释输入和输出输出输入运算符算数运算符关系运算符逻辑运算符赋值运算符其他常量和表达式 print(1 2 * 3)print是Python内置的一个函数&#xff0c;作用为输入打印到控制台形如1 2 * …

人工智能前沿——「全域全知全能」人类新宇宙ChatGPT

&#x1f680;&#x1f680;&#x1f680;OpenAI聊天机器人ChatGPT——「全域全知全能」人类全宇宙大爆炸&#xff01;&#xff01;&#x1f525;&#x1f525;&#x1f525; 一、什么是ChatGPT?&#x1f340;&#x1f340; ChatGPT是生成型预训练变换模型&#xff08;Chat G…

1.半导体基础知识

1.半导体基础知识本征半导体什么是半导体&#xff1f;什么是本征半导体&#xff1f;本征半导体的结构本征半导体中的两种载流子为什么将自然界导电性能中等的半导体材料制成本征半导体杂质半导体N型半导体P型半导体PN结PN结中的扩散运动漂移运动和PN结的形成PN结的单向导电性PN…

uniapp开发小程序-swiper点击预览大图(商品详情页轮播图)

1.实现效果&#xff1a; 2.具体代码&#xff1a; <view class"swiper_box"><!--轮播图--><swiper class"ms_swiper" :autoplay"true" circular"true" change"swiperChange"><swiper-item v-for"…

【动态规划模板】神似的01和完全背包、多重背包和分组背包问题

神似的01背包与完全背包&#x1f349; 【经典题目】01背包采药 题目描述 &#x1f388; 辰辰是个天资聪颖的孩子&#xff0c;他的梦想是成为世界上最伟大的医师。为此&#xff0c;他想拜附近最有威望的医师为师。医师为了判断他的资质&#xff0c;给他出了一个难题。医师把他…

【Redis学习】SpringBoot集成Redis

总体概述 jedis-lettuce-RedisTemplate三者的联系 本地Java连接Redis常见问题 bind配置请注释掉 保护模式设置为no Linux系统的防火墙设置 redis服务器的IP地址和密码是否正确 忘记写访问redis的服务端口号和auth密码 集成jedis 简介 Jedis Client是Redis官网推荐的一个面…

【c语言】文件的读写

文件读写使用二进制读写比较方便&#xff0c;分别使用fread和fwrite函数进行。 一、函数定义 以二进制形式读取文件&#xff0c;从stream流中读取内容&#xff0c;读到ptr指向的空间中&#xff0c;读取size大小的count个内存单元。 返回值为读取到的字符个数。 以二进制形式读…

解决Abp设置DefaultLanguage默认语言不生效的问题

文章目录现象原因分析解决问题现象 默认地&#xff0c;Abp的语言提供程序将返回的CultureInfo为En&#xff0c;在一些默认实现的接口&#xff08;比如/api/TokenAuth/Authenticate&#xff09;返回的错误信息是英文 目标是改成简体中文显示&#xff0c;但是即便我们在AbpSett…

android framework-zygote进程

Zygote进程&#xff1a;可以看到zygote的父进程是init进程 一、Zygote整体时序图 涉及源码路径 android-10.0.0_r41\frameworks\base\cmds\app_process\Android.mk android-10.0.0_r41\frameworks\base\cmds\app_process\app_main.cpp android-10.0.0_r41\frameworks\base\core…

图像阈值化

图像阈值化 图像阈值化简介 ⚫ 图像阈值化是图像处理的重要基础部分, 应用很广泛, 可以根据灰度差异来分割图像不同部分 ⚫ 阈值化处理的图像一般为单通道图像(灰度图) ⚫ 阈值化参数的设置可以使用滑动条来debug ⚫ 阈值化处理易光照影响, 处理时应注意 ⚫ 本节主要介绍…

1000题!!阿里P8架构师手写“Java面试宝典”带你横扫全网

序言 很多同学学习Java并发一头扎进源码&#xff0c;最后头破血流&#xff0c;无功而返。横看成岭侧成峰&#xff0c;远近高低各不同。学习要始终从不同的视角来看待问题。学习并发亦是如此&#xff0c;需要通过理论远看轮廓&#xff0c;然后通过源码近看明细。 今天小编分享…

Java之堆和堆排序

目录 一.什么是堆 1.基本介绍 2.堆的实现方式 二.最大堆的实现 1.最大堆 2.思路分析 0.基础操作 1.添加上浮操作 2.删除下沉操作 3.将数组堆化操作 2.代码实现 三.堆排序 1.什么是堆排序 2.思路分析 3.代码实现 一.什么是堆 1.基本介绍 堆是一种数据结构&#…

新增 ABB COMLI 等 5 个工业协议驱动

3 月&#xff0c;Neuron 团队主要在为 2.4.0 版本的发布做准备&#xff0c;进行了官网文档的重构与完善&#xff0c;为常用驱动增加了相应的连接示例及常见问题。同时新增南向驱动 ABB COMLI&#xff0c;此驱动可通过串口连接 ABB 某些型号的 PLC。 新增驱动插件 南向驱动 IE…

kafka之一----概念结构

https://kafka.apache.org/ https://blog.csdn.net/liuyu973971883/article/details/109036572 https://blog.csdn.net/u013256816/article/details/80300225 1、概念 Kafka是由Apache软件基金会开发的一个开源流处理平台&#xff0c;由Scala和Java编写。Kafka是一种高吞吐量…

【Rust基础】语法知识

系列综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人学习Rust语言整理的&#xff0c;整理期间苛求每个知识点&#xff0c;平衡理解简易度与深入程度。 &#x1f970;来源&#xff1a;材料主要源于b站的Rust中文社群线上学习室和菜鸟教程进行的&#xff0c;每个知识…