C++模版基础
代码地址
git@github.com:CHENLitterWhite/CPPWheel.git
专栏介绍
本专栏会持续更新关于STL中的一些概念,会先带大家补充一些基本的概念,再慢慢去阅读STL源码中的需要用到的一些思想,有了一些基础之后,再手写一些STL代码。
(如果你有喜欢一些底层封装,执着于造轮子,我想这个一期不错的专栏)
函数模版
说下自己的理解,C++通过加入参数化编程可以有效的降低软件的成本。
- 优势
1.通过模版机制,在需要修改代码的时候,对于相同参数的修改不需要大批量修改,降低出错概率。
2.支持泛型编程,总的来说还是为了大量的、无意义的工作。这些工作只是因为数据类型的不同,其算法或者业务逻辑相同时,不需要键入多份代码。
- 特征
1.类型严格匹配是模版函数调用的先决条件
2.函数模板不提供隐式类型转化,因此必须严格按照T --> 为了方便理解,把T看做占位符
3.当模板函数和普通函数都符合调用规则时,优先使用普通函数,因为普通函数在编译期间就生成了函数体,而模板函数的生成需要在调用的时候。--> 这一点很重要,模版函数会进行二次编译来确定具体的类型,可以理解为替换占位符T
4.编译器在处理函数模版的时候能够生成任意类型的函数,根据调用的时机产生不同的函数,编译器会对函数模板进行二次编译。这个参数化编程的基础,也是成为编译时多态的由来。--> 在声明的地方对模板代码本身进行编译,在调用的地方对参数化以后的具体调用进行编译。这也导致了,在使用模板函数时,需要使用hpp文件。
demo.h
demo.cpp
main.cpp
解释下:
我们现在知道了,模版函数会进行两次编译。在第一次编译的时候,如果将声明和定义分开,编译不通过,无法确定类型。在运行的时候才会进行类型的绑定。
我们可以声明和定义都写在 .h中
demo.h
可以顺利编译成功,验证了我们的想法。
-------------------------------------------------------------------------------------------------------------------------
这里引出一个问题,虽然写在.h是可以的,但是这样破坏了C++将.h和.cpp分离编程风格的原则,似乎有些不妥。
hpp文件的由来
.h和.cpp分离之后模版第二次编译时会失败,虽然可以放到.h里面,但是这样破坏了.h和.cpp的传统。
命名空间的重要性
当使用模版时,当模版函数相同时,在调用的时候只会使用一个模板函数。当项目比较大时,通常会通过命名空间将其隔开,这很容易理解。在项目中其实用的不多,通常情况下会以类作为空间的区分。
类模版
类模板用于实现类所需数据的类型参数化。类模板在表示数组、表、图等数据结构时显得特别重要。这些数据结构的表示和算法不受所包含的元素类型的影响。道理跟函数模版一样,减少重复编程,降低代码错误发生的概率,降低代码冗余。
右值引用
[为什么需要右值引用?说白了是为了效率,对于右值引用而言,常用的场景在转义语义上,减少拷贝过程,提高程序的效率]
左值 --> 可以出现在赋值运算符的左边,往往代表的是一个存储空间(本质上就是一个块有名字的内存块)
右值 --> 就是我们所谓是数据,其实也不完全能这样描述。对于右值而言,他是具有存储空间的,只不过这个过程很短暂,只是用在计算过程中的,我们无法获取到,仅仅在某个表达式运行过程中存在。【通常右值是一个和运算过程相匹配的临时对象,这个临时对象在所对应的语句执行完毕之后,就销毁了。所以,我们无法从语法层面上直接访问】
说人话:
左值 --> 是一个有名字的,有固定地址的对象
右值 --> 是一个匿名的,没有固定地址的对象
程序中的体现:
int &a = x; --> 左值引用 [左值引用替代值传递,减少拷贝]、
int &&a = x + y; --> 右值引用[通过&&,形成的语法叫做右值引用,使得右值变成了一个与左值完全相同的持久对象]
右值引用:我们知道浅拷贝会带来资源二次释放问题,但是深拷贝在一些临时资源时又是没有必要的,这是右值引用拷贝构造函数的很大意义,即可以避免二次释放问题,又减少了数据拷贝的过程。
整个过程,看似很简单,但是对于一个追求性能和简洁的语言,是一个很大的进步。
右值引用 -- 完美转发(完美的按照我们的要求进行左值和右值转发)
这里我们需要通过move和forward函数来实现左值和右值的转化。
#include <iostream>using namespace std;void Func(int &x) {cout << "左值" <<endl; }void Func(int &&x) {cout << "右值" << endl; }void Func(const int &x) {cout << "左值常" << endl; }void Func(const int &&x) {cout << "右值常" << endl; }template<typename T> void FuncT(T &&a) {Func(std::forward<T> (a)); }int main() {int a = 10;FuncT(10); // 右值FuncT(a); // 左值FuncT(move(a)); // 右值const int b = 8;FuncT(b); // 左值常FuncT(move(b)); // 右值常return 0; }
可以看到按照我们要求进行参数匹配...这就是所谓的完美转发,笑死
相关文章:
C++模版基础
代码地址 gitgithub.com:CHENLitterWhite/CPPWheel.git 专栏介绍 本专栏会持续更新关于STL中的一些概念,会先带大家补充一些基本的概念,再慢慢去阅读STL源码中的需要用到的一些思想,有了一些基础之后,再手写一些STL代码。 (如果你…...
解决 Elasticsearch 分页查询记录超过10000时异常
查询结果中 hits.total.value 值最大为10000的限制 解决方法: 1、请求设置rest_total_hits_as_inttrue 注意参数需要放在请求头上 builder.addHeader("rest_total_hits_as_int","true"); 2、修改setting的值 #设置返回最大记录条数为1000000 PUT /in…...
百度千帆大模型文心一言api调用
注册百度智能云账号并申请文心千帆大模型资格 https://login.bce.baidu.com/ https://cloud.baidu.com/product/wenxinworkshop 创建应用用于获取access_token 创建应用成功后,可以获取到API Key和Secret Key 获取access_token curl https://aip.baidubce.com/oauth/2.0/to…...
关于HTTP协议的概述
HTTP 的报文大概分为三大部分。第一部分是请求行,第二部分是请求的首部,第三部分才是请求的正文实体。 POST 往往是用来创建一个资源的,而 PUT 往往是用来修改一个资源的。 Accept-Charset,表示客户端可以接受的字符集。防止传过…...
ATFX汇市:8月名义与核心CPI走势分化,美国通胀率算升高还是降低?
ATFX汇市:据美国劳工部昨日公布的数据,8月份,美国名义CPI增速最新值3.7%,高于前值3.2%,高于预期值3.6%,显示高通胀问题有抬头迹象。同一时间公布的8月核心CPI年率最新值4.3%,低于前值4.7%&#…...
c++ 中的函数指针
以下图片演示了c中函数指针的用法。如下图可见,把函数地址赋值给函数指针,用函数名或者函数名的地址,都可以,c编译器不报错。即 ptr f 和 ptr &f 都对。但准确的话,函数名就是地址,在编译时候&#x…...
奶牛个体识别 奶牛身份识别
融合YOLOv5s与通道剪枝算法的奶牛轻量化个体识别方法 Light-weight recognition network for dairy cows based on the fusion of YOLOv5s and channel pruning algorithm 论文链接 知网链接 DOI链接 该文章讨论了奶牛花斑、光照条件、不同剪枝方法、不同剪枝率对准确率的影响…...
【力扣每日一题】2023.9.13 检查骑士巡视方案
目录 题目: 示例: 分析: 代码: 题目: 示例: 分析: 题目给我们一个n*n大小的矩阵,矩阵的元素表示骑士已经行动的次数,问我们骑士能不能按照矩阵里元素顺序来巡视整个…...
【Vue】关于CSS样式绑定整理
因突发奇想设计一款组件,需要根据属性动态绑定样式,故而整理一些Vue的动态绑定样式方法(传参绑定类似,不做过多叙述),仅供参考.方式一: 直接在元素上绑定具体样式方式二: 定义属性对象,绑定到style,可以在style中使用定义的变量方式二: 通过引入自定义组件引入style数据,直接绑…...
Sql语句大全--更新
今天抽空整理下项目中的Sql语句 项目中用到的Sql语句大全 Update 语句 Update 语句 Update语句update OLASF1.LLB set CBBTHCC 52 WHERE CBPOLNUMC201728534update OLASF1.LLB set CBBTHCC 01 WHERE CBPOLNUMC201728534update OLASF1.LB set CBBTHCC 01 WHERE CBPOLNUMC…...
Java面试八股文宝典:序言
序言: Java作为一门广泛应用于企业级应用开发的编程语言,一直以来都是技术面试中的重要话题。无论您是刚刚踏入编程世界的新手,还是经验丰富的Java开发工程师,都需要通过面试来展示自己的技能和知识。 在面试中,除了…...
【多线程案例】单例模式
单例模式是设计模式的一种,先谈谈什么是设计模式? 大家应该都知道棋谱、剑谱之类的,就是一些“高手”在经历过长期的累计之后,更具经验写出的具有固定套路的处理“方法”,只要按照这个套路来,在对局之中必然…...
阿里云部署SpringBoot项目启动后被杀进程的问题
阿里云部署SpringBoot项目启动后被杀进程的问题 最近部署在公司虚拟主机上的SpringBoot项目频繁被杀,这个虚拟主机是个杂货铺,部署着各种项目,时间跨度还大,不同的人负责,个人自扫门前雪,不管他人瓦上霜&a…...
git仓库推送错误
错误背景 从github克隆仓库后,想推送到gitee,在推送时遇到 error: src refspec master does not match any. error: failed to push some refs to <REMOTE_URL>解决方法 rm -rf .github git init git add -A git commit -m "init for gite…...
计网第五章(运输层)(三)
一、UDP协议和TCP协议的对比 1、UDP无连接,TCP面向连接 使用UDP协议的通信双方可以随时发送数据,使用TCP协议的通信双方必须先进行3次握手建立连接,才能发送数据,最后还要进行4次挥手才能释放连接。 2、UDP支持单播、多播以及广…...
OpenCV 07(图像滤波器)
一、卷积 什么是图片卷积? 图像卷积就是卷积核在图像上按行滑动遍历像素时不断的相乘求和的过程 步长 步长就是卷积核在图像上移动的步幅. 上面例子中卷积核每次移动一个像素步长的结果, 如果将这个步长修改为2, 结果会如何? 为了充分扫描图片, 步长一般设为1. padding …...
uniapp项目实践总结(十三)封装文件操作方法
导语:在日常 APP 开发过程中,经常要进行文件的保存、读取列表以及查看和删除文件等操作,接下来就看一下具体的方法。 目录 原理分析方法实现实战演练案例展示 原理分析 主要是以下 API。 uni.saveFile:保存文件到本地缓存列表…...
程序地址空间
✅<1>主页::我的代码爱吃辣 📃<2>知识讲解:Linux——程序地址空间 ☂️<3>开发环境:Centos7 💬<4>前言:我们一直随口就能说出来的栈区,堆区,常量…...
HBS 家庭总线驱动和接收芯片MS1192,应用于电话及相关设备、空调设备、安全设备、AV 装置
MS1192 是适用于 HBS 总线规范(日本电子工业协会) 的适配器芯片,具备发送、接收数据的功能。在发送接收 单元中,采用 AMI 编码方式,可使用双绞线进行互联,信 号传输采用差分方式。 芯片采用单电源…...
IO和进程day08(消息队列、共享内存、信号灯集)
今日任务 1.代码 inversion.c #include <stdio.h> #include <string.h> #include <stdlib.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/ipc.h> #include <sys/shm.h> #include <sys/types.h> #include …...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...
ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...
门静脉高压——表现
一、门静脉高压表现 00:01 1. 门静脉构成 00:13 组成结构:由肠系膜上静脉和脾静脉汇合构成,是肝脏血液供应的主要来源。淤血后果:门静脉淤血会同时导致脾静脉和肠系膜上静脉淤血,引发后续系列症状。 2. 脾大和脾功能亢进 00:46 …...
Appium下载安装配置保姆教程(图文详解)
目录 一、Appium软件介绍 1.特点 2.工作原理 3.应用场景 二、环境准备 安装 Node.js 安装 Appium 安装 JDK 安装 Android SDK 安装Python及依赖包 三、安装教程 1.Node.js安装 1.1.下载Node 1.2.安装程序 1.3.配置npm仓储和缓存 1.4. 配置环境 1.5.测试Node.j…...
Java多线程实现之Runnable接口深度解析
Java多线程实现之Runnable接口深度解析 一、Runnable接口概述1.1 接口定义1.2 与Thread类的关系1.3 使用Runnable接口的优势 二、Runnable接口的基本实现方式2.1 传统方式实现Runnable接口2.2 使用匿名内部类实现Runnable接口2.3 使用Lambda表达式实现Runnable接口 三、Runnabl…...






