C/C++复习(四)

一.模版

模版涉及的是泛型编程,即通过编译器去确定类型的编程方式,模版分为:类模板和函数模版,下面我们一一复习:

函数模版:

格式:

template<typename T1, typename T2,......,typename Tn>
返回值类型 函数名(参数列表){}
//注意:typename是用来定义模板参数关键字,也可以使用class(切记:不能使用struct代替class)//模版既可以为typename,也可以为size_t

对于函数模版,原理就是通过编译器在编译时通过传入的实参来推导形参对应的类型,然后产生专门对应的类型代码,如下:

//模版:
template<class T>
void swap(T& a,T& b)
{T c=a;a=b;b=c;
}int main()
{//调用:int a=10,b=20;swap(a,b);//会去生成下面内容->最后面    return 0;
}//生成的代码:
void swap(int a,int b)
{int c=a;a=b;b=c;
}

函数模版的实例化分为显示实例化和隐式实例化,上面由编译器推导的都是隐式实例化,显示实例化是指调用时,由用户指定类型,从而直接传递类型,如下:

//直接写调用,还是swapint main()
{double d1=1.2;double d2=2.5;swap<double>(d1,d2);return 0;
}//注意点:
//如果类型不匹配,编译器会尝试进行隐式类型转换,如果无法转换成功编译器将会报错

类模板:

格式:

template<class T1, class T2, ..., class Tn>
class 类模板名
{// 类内成员定义
};

类模版大体与函数模版相似使用即可,不同的是类模板实例化必须在类模板名字后跟<>,然后将实例化的类型放在<>,类模板名字不是真正的类,而实例化的结果才是真正的类

然后就是大家还可以去复习下全特化与偏特化内容,然后还有模版最好不要分离编译,使用.hpp,大家可以参考下面博客复习:

C++之模版详解-CSDN博客



二.容器常见知识点

1.vector与list区别?

1.底层实现上:
vector底层是一段连续的顺序表,而list是带头结点的双向循环链表,底层不连续
2.访问上:
vector由于其底层连续,可以支持下标随机访问,list不支持随机访问,必须要遍历查找
3.操作上:
插入:vector任意位置插入由于可能需要挪动空间、开辟新空间,整体拷贝效率非常低下,list插入只需要改变指针指向和开辟一个节点空间即可,效率高
删除:vector除尾删外任意位置删除都要挪动空间,效率低,而list不需要挪动空间,只需要改变指针指向,效率高
4.空间利用上:
vector是连续的顺序表,不易造成空间碎片化,而list是通过指针将节点相连,各节点之间不连续,空间碎片化严重,空间利用率低
5.迭代器上:
vector是使用原生态的迭代器(即只是指针),list是将原生态迭代器进行了封装,可以参考我的github:
https://github.com/zhutishou/C-STL-Copywriting/blob/main/list.cpp
6.使用场景上:
vector适用于高效存储和随机访问上,不关系插入和删除效率;list适用于大量插入和删除上,不注重空间利用和随机访问

2.vector如何实现插入?

1.首先,先判断插入位置是否正确
2.检查空间是否需要扩容
3.将要插入以后的元素整体后移
4.插入当前位置
5.返回插入位置的迭代器
//具体代码如下:
//插入:
//插入:
iterator insert(iterator pos,const T& val)
{if(pos < _begin|| pos > _end){std::cerr<<"该位置不存在"<<std::endl;}//判断是否需要扩容:if(_end == _endofstorage){size_t len = _begin + pos;reserve(capacity()==0?4:2*capacity());pos = _begin + len;}//pos后续位置后移:iterator finish = _end -1;while(finish > pos){*(finish+1) = *finish;finish--;}*pos = val;_end++;return pos;
}
//vector实现代码如下:
https://github.com/zhutishou/C-STL-Copywriting/blob/main/vector.cpp

3.vector和list都有缺陷,是否存在其他容器可以兼顾两者优点呢?

能够兼顾vector和list优点的容器就是deque(双端队列)
介绍:
deque是双开口的“连续”空间的数据结构,注意:“连续”实际上是一段段小空间拼凑出来的,只是支持下标随机访问看做连续,支持头插尾插,并且不需要挪动元素
相比于vector和list优点:
1.相比于vector头插尾插O(1),不用挪动数据,并且扩容时,不需要整体拷贝
2.相比于list,空间利用率更高缺点:
不适合遍历,由于其底层是一个个小空间实现的,迭代器需要不断检查边界,效率低下,因此通常还是使用vector或list使用场景:
deque通常是stack和queue空间适配器默认的容器,原因是因为两者都不需要遍历,而且只在首尾操作

4.map和set底层是什么?

对于map/set和unordered_map/unordered_set这是我们必须掌握的
map/set底层是红黑树,unordered_map/unordered_set底层是哈希表
该问题实际上是问红黑树的相关信息:
一.规则:
1. 每个结点不是红色就是黑色
2. 根节点是黑色的
3. 如果一个节点是红色的,则它的两个孩子结点是黑色的
4. 对于每个结点,从该结点到其所有后代叶结点的简单路径上,均包含相同数目的黑色结点
5. 每个叶子结点都是黑色的(此处的叶子结点指的是空结点)
红黑树通过规则2、3保证树的其最长路径中节点个数不会超过最短路径节点个数的两倍
效率:
红黑树是一个高效的平衡二叉树,增删查改效率都是O(LogN)
实现:
可以参考我的github注意:
multimap和multiset也是红黑树实现的,但是与set/map不同点在于这两个允许出现重复的key值

5.map的operator[]是如何实现的?

V& operator[](const K& key)//V --- value 
{ return (*(_t.Insert(ValueType(key, V()))).first).second;
}operator[]如果存在key,就返回对应的value,如果不存在key,就插入key,返回默认值

6.一个什么类型才能做map和set的key值?

map和set底层都是红黑树,而红黑树是平衡搜索树,所以一定支持比较大小,当然提供相应的仿函数来比较大小的类型也是可以的

7.unordered_map和unordered_set是如何实现的?

这个问题本质上是询问我们其底层实现,显然这两者都是通过哈希实现的,那么就讲述哈希特点
规则:
哈希是通过哈希函数进行相应的映射关系,使key与存储位置建立一一的映射,在查找时就可以快速找到
对比:
哈希在查找时效率为O(1),而红黑树效率为O(LogN),顺序表效率为O(N)
常见问题:
哈希冲突:
该问题无法避免,是指不同关键字通过相同哈希哈数计算出相同的哈希地址,该种现象称为哈希冲突或哈希碰撞,解决方法:建立合适的空间大小,减少通过哈希函数计算之后碰撞的发生,还有两种常见处理方法:开散列和闭散列

8.一个类型做unordered_map和unordered_set的key有什么要求?

哈希是需要通过哈希函数进行映射的,所以key值必须可以实现向整数的转换,这样才能映射到存储空间中

最后,感谢你的支持!!!

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

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

相关文章

022 基础 IO —— 文件

&#x1f984; 个人主页: 小米里的大麦-CSDN博客 &#x1f38f; 所属专栏: Linux_小米里的大麦的博客-CSDN博客 &#x1f381; GitHub主页: 小米里的大麦的 GitHub ⚙️ 操作环境: Visual Studio 2022 文章目录基础 IO —— C 语言文件 I/O 操作基础前言1. C 语言文件操作函数汇…

MNN LLM Chat iOS 流式输出优化实践

本文介绍了在 iOS 平台上使用 MNN 框架部署大语言模型&#xff08;LLM&#xff09;时&#xff0c;针对聊天应用中文字流式输出卡顿问题的优化实践。通过分析模型输出与 UI 更新不匹配、频繁刷新导致性能瓶颈以及缺乏视觉动画等问题&#xff0c;作者提出了一套包含智能流缓冲、U…

【开发技巧】VS2022+QT5+OpenCV4.10开发环境搭建QT Creator

VS2022编译器支持配置 QT5默认安装以后支持的是VS2015与VS2017&#xff0c;不支持VS2022&#xff0c;所以必须首先在Qt Creator中配置支持VS2022。配置顺序如下&#xff1a; 首先打开【工具】->【选项】 然点击Kits里面的【编译器】选项。点击Manual下面的【C】然后点击【…

【Linux系统】动静态库的制作

前言&#xff1a; 上文我们讲到了文件系统【Linux系统】详解Ext2&#xff0c;文件系统-CSDN博客 本文我们来讲讲动静态库的制作 库 【Linux】编译器gcc/g及其库的详细介绍_linux gcc 有哪些库-CSDN博客 这篇文章的第4大点&#xff0c;简单是介绍了一下库的基本概念。 静态库 静…

链式二叉树的基本操作——遍历

本文笔者将带领读者一起学习链式二叉树的一些基本语法&#xff0c;至于更难一些的插入删除等&#xff0c;笔者将在后续C更新后再次详细带领大家学习。 首先&#xff0c;在进行二叉树之前&#xff0c;我们需要一颗二叉树&#xff0c;而二叉树的初始化现阶段实现不太现实&#x…

Windows运维之以一种访问权限不允许的方式做了一个访问套接字的尝试

一、问题场景 在Windows 上运维服务过程中&#xff0c;经常会遇到运行服务&#xff0c;部署安装时候无任何问题&#xff0c;后续再某个特殊时间点&#xff0c;突然服务无法启动了。再次启动时&#xff0c;提示端口占用与以一种访问权限不允许的方式做了一个访问套接字的尝试。 …

2020/12 JLPT听力原文 问题二 3番

3番&#xff1a;レストランで、女の人と店長が話しています。店長はサラダについて、どんなアドバイスをしていますか。女&#xff1a;店長、この前話してた新しいランチメニューのサラダを作ってみたんですが、どうでしょうか。 男&#xff1a;ああ、サラダだけで満足できるっ…

芯片行业主要厂商

作为一个小白&#xff0c;每次淘宝买芯片时看到相似的命名规则&#xff1a;“OPA、AD、LT、MAX”等等时&#xff0c;我不禁好奇这些芯片行业大厂有哪些&#xff0c;所以查了些资料&#xff1a; 1. 德州仪器&#xff08;Texas Instruments, TI&#xff09; 公司概况&#xff1…

【BLE系列-第四篇】从零剖析L2CAP:信道、Credit流控、指令详解

目录 引言 一、L2CAP主要功能 二、L2CAP帧格式及信道概念 2.1 逻辑链路是什么&#xff1f; 2.2 逻辑信道的作用 2.3 L2CAP帧格式介绍 三、L2CAP信令信道 3.1 信令信道帧格式说明 3.2 信令信道指令介绍 3.2.1 信令信道指令一览表 3.2.2 Credit流控规则 引言 在BLE协…

CSS保持元素宽高比,固定元素宽高比

方法一&#xff1a; <div class"hcp-fixed-aspect-ratio-box">这里是正文内容 </div>.hcp-fixed-aspect-ratio-box {width: 50%;color: #FFFFFF;margin: 100px auto;background: #FF0000;/* 宽高比2:1&#xff0c;兼容性可能不太好 */aspect-ratio: 2 / …

数据分析小白训练营:基于python编程语言的Numpy库介绍(第三方库)(上篇)

&#xff08;一&#xff09;Numpy库的安装安装指定版本的Numpy库&#xff0c;打开命令提示符&#xff0c;输入下图内容&#xff0c;只需要将1.25.5的版本修改成个人需要的版本&#xff0c;然后按下回车键&#xff0c;numpy库就安装在python中&#xff1a;指定版本numpy库安装可…

从 Windows 到 Linux 服务器的全自动部署教程(免密登录 + 压缩 + 上传 + 启动)

一、准备工作 1. 环境说明 本地开发环境&#xff1a;Windows 服务器&#xff08;需执行部署脚本&#xff09;目标服务器&#xff1a;Linux 服务器&#xff08;需安装 node.js、pm2、unzip&#xff09;核心工具&#xff1a;7-Zip&#xff08;压缩&#xff09;、OpenSSH&#x…

智能汽车领域研发,复用云原始开发范式?

汽车电子电气架构演进趋势&#xff1a;分散的功能ECU -> 域控制器 -> 中央计算服务器汽车电子方案与架构在发展与迭代时会使用虚拟化方法几种可行的软硬一体化方案&#xff1a;多ECU&#xff0c;硬件隔离&#xff0c;硬件分区&#xff0c;车规级多核硬件架构 Hypervisor…

数据电台询价的询价要求

技术规格及主要参数 1.电台基本要求&#xff1a; 1.1 电台中的信号处理基于FPGA设计&#xff0c;采用FPGAARM高速AD/DA设计架构&#xff1b; 1.2 具备频谱感知、自主选频、跳频、扩频等功能&#xff1b; 1.3 具备链路质量信息、自组网路由信息、电池电压监测信息、北斗定位信息…

IoT/HCIP实验-5/基于WIFI的智慧农业实验(LwM2M/CoAP+PSK+ESP8266 连接到 IoTDA)

文章目录概述WIFI8266 通信模组WIFI模组也用AT指令&#xff1f;ESP8266 内置协议栈?支持的无线网络模式MCU通过串口与模组交互Wifi模组做客户端PC-AT接入路由器向本地TCP服务发数据用代码接入你家路由器已接入AP&#xff08;你家Wifi&#xff09;平台侧开发工程配置和编译工程…

定时器输出PWM波配置(呼吸灯)

使用定时器 4 通道 3 生成 PWM 波控制 LED1 &#xff0c;实现呼吸灯效果。 频率&#xff1a;2kHz&#xff0c;PSC71&#xff0c;ARR499pwm.c:#include "pwm.h" // 本模块头文件&#xff1a;应声明 pwm_init/pwm_compare_set 等原型、并包含 HAL 头//&#xff08;示…

[ai-agent]环境简介之沙盒e2b vs daytona

所谓的环境的就是agent运行在哪里&#xff0c;或者是agent和那里进行交互。 最常见的环境就是本地开发环境&#xff0c;也就是个人主机&#xff0c;但是存在问题就是没有办法出网和横向扩展。 在沙盒之前也是有其他选择的&#xff1a; 云服务器&#xff0c; 虚拟机&#xff0c;…

【前端面试题】前端面试知识点(第三十一题到第六十一题)

三十一. CSS实现垂直水平居中 实现元素的垂直水平居中是前端开发中的常见需求,主要有以下几种思路: text-align + line-height实现单行文本水平垂直居中 适用于单行文本元素,通过text-align: center实现水平居中,line-height等于容器高度实现垂直居中 text-align + vertic…

嵌入式练习项目——————抓包获取天气信息

一、内容 尝试通过实时天气接口 - 数据接口 - NowAPI此网站获取天气信息&#xff0c;实现可以发送城市查询当前天气和未来天气 二、获取请求报文 可以根据测试示例看到获取内容&#xff0c;此时数据是cJSON格式&#xff0c;我们首先要通过合适的网址抓包获取到请求报文&#x…

Python爬虫实战:研究NewsCrawl ,构建新浪和网易新闻数据采集系统

1. 引言 1.1 研究背景与意义 在信息时代,新闻作为社会动态、公众观点的重要载体,其传播速度与影响力持续扩大。传统的人工筛选与采集方式已无法满足对海量新闻数据的高效处理需求,亟需自动化工具实现大规模、结构化的新闻数据采集。网络爬虫技术作为一种按照预设规则自动抓…