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

面试浅谈之 C++ STL 篇

面试浅谈之 C++ STL 篇

一 🏠 概述

HELLO,各位博友好,我是阿呆 🙈🙈🙈

这里是面试浅谈系列,收录在专栏面试中 😜😜😜

本系列将记录一些阿呆个人整理的面试题 🏃🏃🏃

OK,兄弟们,废话不多直接开冲 🌞🌞🌞


二 🏠 核心

1、什么是 STL ?

STL (Standard Template Library) 是 C++ 的标准模板库,主要由container(容器)、algorithm(算法)和iterator(迭代器)三大部分构成:

1、容器 :存放数据对象(就是一种数据结构,例链表、栈、队列等等)

2、算法 :操作容器中的数据对象(操作容器数据的模板函数,sort、find、copy、for_each)

3、迭代器 :访问容器中的数据对象(正向,反向,可读)

剩余三大组件是 :仿函数、适配器、空间配置器


2、HashMap 和 Map 适用场景

HashMap 底层实现链式哈希表(无序),查找速度快(常量级)

Map 底层实现是红黑树(有序),查找速度相对慢( log(n) )

在数据量级高且追求查询性能时,使用 HashMap

在数据量级低且要求内存低消耗时,使用 Map


3、STL HashTable 底层实现

开链法 解决 hash 冲突

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zDKNS9gR-1676880997984)(E:\2022年MD文档\2023 年 MD文档\一月\面试浅谈之 C++ STL 篇.assets\1676806462680.png)]


4、Vector 底层原理及相关问题

① vector 底层原理

动态数组,包含三个迭代器,start 和 finish 之间是已被使用的空间范围 ,end_of_storage 是整块连续空间包括备用空间尾部

当空间不够装下数据时,会自动申请更大空间,把原来数据拷贝到新内存空间,释放原空间【扩容】

当释放或者删除数据时,内存空间不释放,仅清空数据

任何 Vector 空间重新配置的操作,指向原 Vector 迭代器会失效


② vector reserve 和 resize 区别

reserve 保证空间大小达到参数指定大小,扩充内存空间,解决多次开辟、释放空间问题

resize 涉及成员对象默认初始化,也会改变内存空间大小


③ vector size 和 capacity 区别

size 表示有多少元素(finish - start)

capacity 表示内存空间可容纳多少元素(end_of_storage - start)


④ vector 元素类型可以是引用吗?

vector 元素类型是对象,引用不是对象,没有实际地址


⑤ vector 迭代器失效情况

① 当插入一个元素后,end 返回迭代器失效

② 当插入一个元素后,造成动态扩容,first 和 end 返回迭代器失效

③ 删除操作 (erase,pop_back) ,指向删除点和后面元素的迭代器失效


⑥ 正确释放 vector 内存

vec.clear() :清空内容,但不释放内存

vector().swap(vec) :清空内容,且释放内存,得到⼀个空 vector

vec.shrink_to_fit() :请求容器降低其 capacity 和 size 匹配

vec.clear(),vec.shrink_to_fit() :清空内容,且释放内存


⑦ vector 扩容为什么 1.5 倍或 2 倍

可能产生堆空间浪费,成倍增长倍数不能太大


⑧ vector 常用函数

vector<int> vec(10,100); //创建10个元素,每个元素值为100
vec.resize(r,vector<int>(c,0)); //⼆维数组初始化
reverse(vec.begin(),vec.end()) //将元素翻转
vec.push_back(val); //尾部插⼊数字
vec.size(); //向量⼤⼩
iterator = vec.erase(iterator) //删除元素find(vec.begin(),vec.end(),1); //查找元素
sort(vec.begin(),vec.end()); //排序,默认升序排列

5、map [ ] 与 find 区别

[] 作用 :将关键码作为下标执行查找;如果不存在关键码,将⼀个具有该关键码和值类型默认值插入

find 函数:关键码执行查找,找到返回该位置迭代器;不存在这个关键码,返回尾迭代器


6、其它 STL 容器底层实现

参考 C++ 语言专栏中 C++ 浅谈 STL 系列


三 🏠 结语

身处于这个浮躁的社会,却有耐心看到这里,你一定是个很厉害的人吧 👍👍👍

各位博友觉得文章有帮助的话,别忘了点赞 + 关注哦,你们的鼓励就是我最大的动力

博主还会不断更新更优质的内容,加油吧!技术人! 💪💪💪

相关文章:

面试浅谈之 C++ STL 篇

面试浅谈之 C STL 篇 一 &#x1f3e0; 概述 HELLO&#xff0c;各位博友好&#xff0c;我是阿呆 &#x1f648;&#x1f648;&#x1f648; 这里是面试浅谈系列&#xff0c;收录在专栏面试中 &#x1f61c;&#x1f61c;&#x1f61c; 本系列将记录一些阿呆个人整理的面试题…...

【PTA Advanced】1144 The Missing Number(C++)

目录 题目 Input Specification: Output Specification: Sample Input: Sample Output: 思路 代码 题目 Given N integers, you are supposed to find the smallest positive integer that is NOT in the given list. Input Specification: Each input file contains…...

oracle的sqlnet.ora文件配置传输加密算法

sqlnet.ora文件位于ORACLE_HOME/network/admin目录中。sqlnet.ora文件中增加如下&#xff1a;SQLNET.ENCRYPTION_SERVER REQUIRED SQLNET.ENCRYPTION_TYPES_SERVER (RC4_256) SQLNET.CRYPTO_CHECKSUM_SERVER REQUIRED SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER MD5SQLNET.ENCRYP…...

RK3568存储性能测试

USBU盘储存性能参数(USB3.0接口)参数测试条件最小典型最大单位说明写速度写入1GB数据—32.6—MB/sU盘型号&#xff1a;KODAK&#xff0c;32GB USB3.0读速度读取1GB数据—66.7—MB/s 备注HW356X-CORE-4GB-32GBHW356X-GKA&#xff0c;操作系统&#xff1a;LinuxU盘储存性能参数(U…...

Homekit智能家居一智能灯泡

一、什么是智能灯 传统的灯泡是通过手动打开和关闭开关来工作。有时&#xff0c;它们可以通过声控、触控、红外等方式进行控制&#xff0c;或者带有调光开关&#xff0c;让用户调暗或调亮灯光。 智能灯泡内置有芯片和通信模块&#xff0c;可与手机、家庭智能助手、或其他智能…...

轻量级 Java 权限认证框架——Sa-Token

文章目录Sa-Token 介绍SpringBoot 集成 Sa-TokenSa-Token 功能登录认证会话查询Token 查询权限认证权限校验角色校验注解鉴权注册 Sa-Token 拦截器关闭注解校验路由拦截鉴权注册 Sa-Token 路由拦截器[记住我] 模式密码加密Sa-Token 集成 Redis方式1、使用 jdk 默认序列化方式方…...

算法复习(四、五、六)

动态规划 动态规划算法的有效性依赖于问题本身所具有的两个重要性质&#xff1a;最优子结构、重叠子问题 关于动态规划算法和备忘录方法的适用条件&#xff1a; 要求&#xff1a; 用分治法和动态规划法分别解决最大子段和问题&#xff08;第四步求最优解不需要掌握&#xff…...

SORT与DeepSORT简介

一、MOT( mutil-object tracking)步骤 在《DEEP LEARNING IN VIDEO MUTIL-OBJECT TEACKING: A SURVEY》这篇基于深度学习多目标跟踪综述中&#xff0c;描绘了MOT问题的四个主要步骤 1.跟定视频原始帧 2.使用目标检测器如Faster-rcnn, YOLO, SSD等进行检测&#xff0c;获取目标…...

TCP/IP网络编程——多播与广播

完整版文章请参考&#xff1a; TCP/IP网络编程完整版文章 文章目录第 14 章 多播与广播14.1 多播14.1.1 多播的数据传输方式以及流量方面的优点14.1.2 路由&#xff08;Routing&#xff09;和 TTL&#xff08;Time to Live,生存时间&#xff09;&#xff0c;以及加入组的办法14…...

K8S DNS解析过程和延迟问题

一、Linux DNS查询解析原理&#xff08;对于调用glibc库函数gethostbyname的程序&#xff09;我们在浏览器访问www.baidu.com这个域名&#xff0c;dns怎么查询到这台主机呢&#xff1f;  1、在浏览器中输入www.baidu.com域名&#xff0c;操作系统会先查找本地DNS解析器缓存&a…...

【JavaScript】js实现深拷贝的方法

前言 在js中我们想要实现深拷贝&#xff0c;首先要了解深浅拷贝的区别。 浅拷贝&#xff1a;只是拷贝数据的内存地址&#xff0c;而不是在内存中重新创建一个一模一样的对象&#xff08;数组&#xff09; 深拷贝&#xff1a;在内存中开辟一个新的存储空间&#xff0c;完完全全…...

RK3288 GPIO记录

1、引脚对应的GPIO 编号第一种 使用/sys/kernel/debug/gpio查询所有gpio引脚的基数第二种 cat /sys/class/gpio/gpiochip248/label对应的label就是GPIO引脚&#xff0c;例如下图GPIO8对应的基数就是2482、计算编号编号 基数 PIN脚如GPIO8的基数是248&#xff0c; GPIO8_A6的编…...

MongoDB介绍及使用教程

文章目录一、MongoDB介绍1. 什么是MongoDB2. 为什么要用MongoDB3. MongoDB的应用场景4. MongoDB基本概念二、MongoDB使用教程1.下载安装&#xff08;Windows&#xff09;2.MongoDB Conpass简单使用&#xff08;选学&#xff09;3.使用navicat连接MongoDB4.JAVA项目中使用MongoD…...

51单片机开发环境搭建 - VS Code 从编写到烧录

我安装并测试成功的环境&#xff1a; 操作系统&#xff1a;Windows 10 (22H2)单片机&#xff1a;STC89C52RCPython version: 3.7.6 在这之前&#xff0c;给51单片机写程序是用 Keil 5&#xff08;编写编译&#xff09;、STC-ISP&#xff08;烧录&#xff09;&#xff0c;由于…...

python datetime、字符串和时间戳之间的相互转换12小时制和24小时制时间相互转化

文章目录1.字符串转datetime格式2.datetime转字符串3.时间戳转datetime格式4.datetime格式转时间戳5.应用&#xff1a;将12小时制的字符串转换为时间戳1.字符串转datetime格式 把字符串转换为datetime的格式 项目字符串的样子‘%m/%d/%Y %H:%M:%S’2/3/2023 15:30:20‘%m-%d-…...

百度百科词条怎么做?百度百科词条创建攻略分享

只要是想要将自己宣传出去的企业或是个人&#xff0c;都建议创建属于自己的百度百科词条&#xff0c;因为百度百科词条流量大、权重高、排名靠前&#xff0c;创建百度百科词条可以提高企业或是个人的知名度和口碑。 百度百科词条怎么做&#xff1f;每天都有用户在百度上搜索这…...

基于Hive的河北新冠确诊人数分析系统的设计与实现

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…...

k8s二进制部署

目录 一、环境准备 常见的k8s部署方式 关闭防火墙 关闭selinux 关闭swap 根据规划设置主机名 在master添加hosts 将桥接的IPv4流量传递到iptables的链 时间同步 二、部署etcd集群 1、master节点部署 #查看证书的信息 上传etcd-cert.sh 和etcd.sh 到/opt/k8s/ 目录…...

Windows出现0xc00d36e5错误怎么办?

当我们使用Windows Media Player来播放视频文件时&#xff0c;可能会出现无法播放&#xff0c;并显示0xc00d36e5错误代码。该错误可能是因为Windows Media Player不支持视频格式、注册表项损坏、系统配置问题、第三方应用程序冲突等。下面将开始介绍0xc00d36e5错误的解决方法&a…...

Idea搭建Spring5.3.x源码阅读环境

1. 概述 Spring是一个轻量级Java开源框架&#xff0c;在Java项目开发过程中已经离不开Spring全家桶了&#xff0c;包括Spring、SpringBoot、SpringCloud等&#xff0c;学习好Spring基础源码也有助于更好在项目中使用Spring相关组件&#xff0c;在学习源码前需要搭建好源码学习…...

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

Java 加密常用的各种算法及其选择

在数字化时代&#xff0c;数据安全至关重要&#xff0c;Java 作为广泛应用的编程语言&#xff0c;提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景&#xff0c;有助于开发者在不同的业务需求中做出正确的选择。​ 一、对称加密算法…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

如何应对敏捷转型中的团队阻力

应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中&#xff0c;明确沟通敏捷转型目的尤为关键&#xff0c;团队成员只有清晰理解转型背后的原因和利益&#xff0c;才能降低对变化的…...

Chrome 浏览器前端与客户端双向通信实战

Chrome 前端&#xff08;即页面 JS / Web UI&#xff09;与客户端&#xff08;C 后端&#xff09;的交互机制&#xff0c;是 Chromium 架构中非常核心的一环。下面我将按常见场景&#xff0c;从通道、流程、技术栈几个角度做一套完整的分析&#xff0c;特别适合你这种在分析和改…...