【C++ 面试 - STL】每日 3 题(五)

news2024/11/13 11:20:54

✍个人博客:Pandaconda-CSDN博客
📣专栏地址:http://t.csdnimg.cn/fYaBd
📚专栏简介:在这个专栏中,我将会分享 C++ 面试中常见的面试题给大家~
❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创作的最大动力💪

13. STL 中 map 的实现

map 的特性是所有元素会根据键值进行自动排序。map 中所有的元素都是 pair,拥有键值 (key) 和实值 (value) 两个部分,并且不允许元素有相同的 key。

一旦 map 的 key 确定了,那么是无法修改的,但是可以修改这个 key 对应的 value,因此 map 的迭代器既不是 constant iterator,也不是 mutable iterator。

标准 STL map 的底层机制是 RB-tree(红黑树),另一种以 hash table 为底层机制实现的称为 hash_map。map 的架构如下图所示:
在这里插入图片描述
map 的在构造时缺省采用递增排序 key,也使用 alloc 配置器配置空间大小,需要注意的是在插入元素时,调用的是红黑树中的 insert_unique() 方法,而非 insert_euqal()(multimap 使用)。
举个例子:

#include <map>
#include <iostream>
#include <string>
using namespace std;

int main()
{
    map<string, int> maps;
    //插入若干元素
    maps["jack"] = 1;
    maps["jane"] = 2;
    maps["july"] = 3;
    //以pair形式插入
    pair<string, int> p("david", 4);
    maps.insert(p);
    //迭代输出元素
    map<string, int>::iterator iter = maps.begin();
    for (; iter != maps.end(); ++iter)
    {
        cout << iter->first << " ";
        cout << iter->second << "--"; //david 4--jack 1--jane 2--july 3--
    }
    cout << endl;
    //使用subscipt操作取实值
    int num = maps["july"];
    cout << num << endl; // 3
    //查找某key
    iter = maps.find("jane");
    if(iter != maps.end())
        cout << iter->second << endl; // 2
    //修改实值
    iter->second = 100;
    int num2 = maps["jane"]; // 100
    cout << num2 << endl;
    
    return 0;
}

需要注意的是 subscript(下标)操作既可以作为左值运用(修改内容)也可以作为右值运用(获取实值)。例如:

maps["abc"] = 1; //左值运用int num = masp["abd"]; //右值运用

无论如何,subscript 操作符都会先根据键值找出实值,源码如下:

...T& operator[](const key_type& k){    
    return (*((insert(value_type(k, T()))).first)).second;
}...

代码运行过程是:首先根据键值和实值做出一个元素,这个元素的实值未知,因此产生一个与实值型别相同的临时对象替代:

value_type(k, T());

再将这个对象插入到 map 中,并返回一个 pair:

pair<iterator,bool> insert(value_type(k, T()));

pair 第一个元素是迭代器,指向当前插入的新元素,如果插入成功返回 true,此时对应左值运用,根据键值插入实值。插入失败(重复插入)返回 false,此时返回的是已经存在的元素,则可以取到它的实值。

(insert(value_type(k, T()))).first; //迭代器
*((insert(value_type(k, T()))).first); //解引用
(*((insert(value_type(k, T()))).first)).second; //取出实值

由于这个实值是以引用方式传递,因此作为左值或者右值都可以。

14. set 和 map 的区别,multimap 和 multiset 的区别

set 只提供一种数据类型的接口,但是会将这一个元素分配到 key 和 value 上,而且它的 compare_function 用的是 identity() 函数,这个函数是输入什么输出什么,这样就实现了 set 机制,set 的 key 和 value 其实是一样的了。其实他保存的是两份元素,而不是只保存一份元素。

map 则提供两种数据类型的接口,分别放在 key 和 value 的位置上,他的比较 function 采用的是红黑树的 comparefunction(),保存的确实是两份元素。
他们两个的 insert 都是采用红黑树的 insert_unique() 独一无二的插入 。

multimap 和 map 的唯一区别就是:multimap 调用的是红黑树的 insert_equal(),可以重复插入而 map 调用的则是独一无二的插入 insert_unique(),multiset 和 set 也一样,底层实现都是一样的,只是在插入的时候调用的方法不一样。

红黑树概念

面试时候现场写红黑树代码的概率几乎为 0,但是红黑树一些基本概念还是需要掌握的。

1、它是二叉排序树(继承二叉排序树特显):

  • 若左子树不空,则左子树上所有结点的值均小于或等于它的根结点的值。
  • 若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值。
  • 左、右子树也分别为二叉排序树。

2、它满足如下几点要求:

  • 树中所有节点非红即黑。
  • 根节点必为黑节点。
  • 红节点的子节点必为黑(黑节点子节点可为黑)。
  • 从根到 NULL 的任何路径上黑结点数相同。

3、查找时间一定可以控制在 O(logn)。

15. hashtable 中解决冲突有哪些方法?

记住前三个:

线性探测

使用 hash 函数计算出的位置如果已经有元素占用了,则向后依次寻找,找到表尾则回到表头,直到找到一个空位。

开链

每个表格维护一个 list,如果 hash 函数计算出的格子相同,则按顺序存在这个 list 中。

再散列

发生冲突时使用另一种 hash 函数再计算一个地址,直到不冲突。

二次探测

使用 hash 函数计算出的位置如果已经有元素占用了,按照 12、22、3^2… 的步长依次寻找,如果步长是随机数序列,则称之为伪随机探测。

公共溢出区

一旦 hash 函数计算的结果相同,就放入公共溢出区。

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

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

相关文章

《JavaEE进阶》----10.<SpringMVC应用分层:【三层架构】>

本篇博客我们主要讲解 1.应用的分层&#xff1a;三层架构 2.Spring MVC和三层架构的区别和联系 3.软件设计原则&#xff1a;高内聚低耦合 4.应用分层的好处 5.通过应用分层后的代码示例 一、三层架构简介 阿里开发手册中,关于工程结构部分,定义了常见工程的应用分层结构: 上图…

echarts处理y轴最大小值根据数据动态处理、分割数和是否从0开始

方法 /*** 取整* param value 输入值* param scale 保留位数 正数是整数位&#xff0c;负数是小数位* param isUpper true 向上取整 false向下取整* returns*/ const numberFix (value, scale, isUpper) > {const moreThanZero value > 0value Math.abs(value)if (s…

HarmonyOS NEXT 应用运行异常记录与解决(持续整理版)

问题一 App Launch Failed to get the device apiVersion. 解决方案 进入到设备管理&#xff0c;点击对应开启的模拟器设备&#xff0c;先将模拟器关闭&#xff0c;然后点击查出掉用户数据&#xff0c;再重启。 重启之后&#xff0c;一般能解决。如果遇到还是显示拿不到apiVer…

关于GeoTools技术架构知识简介

目录 前言 一、GeoTools架构说明 1、GeoTools Library 2、各模块说明 3、GeoTools插件 4、GeoTools的扩展功能 5、GeoTools的xml支持 二、从Geotools的源码看架构 1、GeoTools源码 2、各功能模块介绍 3、以library来看相关组件 三、总结 前言 作为使用Java语言开发的…

CAD图纸怎么加密?推荐5个有效防止图纸泄露的方法

随着技术的发展&#xff0c;CAD图纸成为了设计和工程领域不可或缺的一部分。然而&#xff0c;这些图纸往往包含敏感信息&#xff0c;一旦泄露可能会给企业带来严重的商业损失或知识产权问题。因此&#xff0c;采取有效的加密和保护措施至关重要。下面将介绍五种有效的方法来保护…

DBMS-2.1 数据库设计(1)——数据库设计与数据模型

本文章的素材与知识均来自于李国良老师的数据库管理系统课程。 数据库设计和数据模型 一.数据模型 1.概念 &#xff08;1&#xff09;数据库结构的基础就是数据模型。数据模型是用于描述数据间的联系、数据语义(即数据操作)、一致性(完整性)约束的概念和工具的集合。 2.分…

海外合规|新加坡网络安全认证计划简介(一)

新加坡网络安全局&#xff08;CSA&#xff09;为组织制定了网络安全认证计划&#xff0c;旨在表彰具有良好网络安全实践的组织。Cyber Essentials 标志表彰已实施网络卫生措施的组织&#xff0c;而 Cyber Trust 标志则是表彰具有全面网络安全措施和实践的组织的卓越标志。这些标…

【递归、回溯专题(三)】记忆化搜索题集

文章目录 1. 斐波那契数2. 不同路径2. 不同路径3. 最长递增子序列4. 猜数字大小II 1. 斐波那契数 斐波那契数 &#xff08;通常用 F(n) 表示&#xff09;形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。也就是&#x…

逻辑器件输出高阻态时,输出端口的电平是什么状态呢?

高阻态是逻辑器件输出端口的一种状态&#xff0c;当端口处于高阻态时&#xff0c;输入端口的电平变化不会引起输出端口变化&#xff0c;不会对与之相连的后级输入端口或总线产生影响&#xff0c;对于总线架构的电路极为重要。   输出端口处于高阻态时&#xff0c;输出端口处于…

什么是分段和分页?

内存管理的必要性 很早之前计算机只能运行单个进程&#xff0c;就算运行批处理程序&#xff0c;也是棑好对&#xff0c;一个一个的进行处理&#xff0c;不存在多个进程并发运行&#xff0c;这时候内核对于内存管理相对比较简单&#xff0c;直接把物理内存地址拿过来是使用即可。…

网络编程TCP和UDP

将TCP的CS模型再敲一遍 TCP服务器 1->创建原始的套接字描述符 2->将原始套接字与主机ip绑定 3->将原始套接字设置监听状态 4->接收客户端连接&#xff0c;获取客户端信息&#xff0c;因为原始套接字被用了&#xff0c;所以创建新的套接字描述符用于客户端通信…

2区SCI仅52天直录!9月甄选SCI/SSCI合集(含各领域)

【SciencePub学术】我处SciencePub学术2024年9月SCI/SSCI/EI/CNKI刊源表已更新&#xff01;内含多本中科院TOP、CCF推荐以及进展超顺的优质期刊&#xff0c;最快1-2个月录用&#xff01; 计算机领域重点SCI 环境地质化学领域重点SCI 生物医学领域重点SCI 数学材料物理领域重点S…

拥有这些AI绘画网站,让你轻松告别手绘时代!

在这个充满无限可能的数字世界里&#xff0c;AI 绘画动漫网站已经成为了许多艺术家和设计师的新宠。从手绘时代的岁月如歌&#xff0c;到今天科技的飞速发展&#xff0c;我们已经可以用AI技术创作出令人惊叹的艺术作品&#xff0c;打开了全新的创作空间。接下来&#xff0c;就让…

图形化编程011

项目描述&#xff1a; 点击绿旗&#xff0c;点击空格键&#xff0c;角色向上游动&#xff0c;松开空格键&#xff0c;角色向下飘落。 浮游生物碰到角色会发出声音并隐藏&#xff0c;碰到舞台边缘会重新出现。 30秒后程序结束 。 拆解步骤&#xff1a; 1、添加背景和角色以及…

如何打造一个智能化的远程在线考试系统?

远程教育与在线考试已成为提升知识传播效率和学习灵活性的重要手段。 土著刷题在线考试系统&#xff0c;凭借其完善的多功能考试模块&#xff0c;为教育机构、学校乃至企业提供了一个智能化的远程在线考试解决方案。 接下来将介绍土著刷题在线考试系统如何助力用户构建一个高效…

第L3周:机器学习-逻辑回归

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 目标&#xff1a; 逻辑回归适用于分类问题&#xff0c;主要用于解决二分类或多分类的问题。比如&#xff1a;用户购买某商品的可能性&#xff0c;某病人患有某…

单端输入与差分输入

单端输入&#xff1a; 单端输入测量的是一根导线与地之间的电压差&#xff0c;然后将这个差值放大以提供输出。 然而&#xff0c;单端输入容易受到噪声的影响&#xff0c;因为承载信号的导线会吸收电背景噪声。此外&#xff0c;单端输入上的信号还可能受到地环路的影响。 例…

鸿蒙(API 12 Beta6版)图形【NativeDisplaySoloist开发指导】方舟2D图形服务

如果开发者想在独立线程中进行帧率控制的Native侧业务&#xff0c;可以通过DisplaySoloist来实现&#xff0c;如游戏、自绘制UI框架对接等场景。 开发者可以选择多个DisplaySoloist实例共享一个线程&#xff0c;也可以选择每个DisplaySoloist实例独占一个线程。 接口说明 函…

【MySQL00】【 杂七杂八】

文章目录 一、前言二、MySQL 文件1. 参数文件2. 日志文件3. 套接字文件4. pid 文件5. 表结构定义文件6. InnoDB 存储引擎文件 二、BTree 索引排序三、InnoDB 关键特性1. 插入缓冲1.1 Insert Buffer 和 Change Buffer1.1 缓冲合并 2. 两次写2. 自适应哈希索引3. 异步IO4. 刷新邻…

宝藏!《联盟现代控制特训班题库》(麒麟篇) 讲义部分:甄选内容

本文内容&#xff0c;全部选自自动化考研联盟的&#xff1a;初试《现代控制特性班题库》(麒麟篇)&#xff0c;分为讲义和习题两个部分&#xff0c;本文为讲义部分的甄选内容&#xff0c;一本书帮你学透现控。 目录 Part1&#xff1a;资料封面&目录 讲义部分目录 Part2&…