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

C++模板【上篇】 —详解模板基础语法

文章目录

  • 前言
  • 1. 泛型编程
  • 2. 模板的类别
    • 2.1 函数模板
    • 2.2 类模板
  • 3. 模板的实例化
    • 3.1 函数模板的实例化
      • 3.1.1 隐式实例化
      • * 编译器实例化原理
      • 3.1.2 显示实例化
    • 3.2 类模板的实例化

前言

在这篇文章中,主要介绍一些模板的基础的语法和一些细节,同时了解泛型编程。我们主要从如下的角度进行谈论:

  1. 泛型编程
  2. 模板的分类
  3. 模板的实例化(简要说明实例化原理)

1. 泛型编程

我们先来看一个这样的场景,例1.1:

//实现一个交换函数
void swap(int& x, int& y)
{int tmp = x;x = y;y = tmp;
}
但是这个函数只能实现整数的交换……

如果我们想要实现doublechar、指针……类型的转换由该如何办呢?是否需要将每一个都写一遍,当一个CV工程师?
例1.2:

void swap(double& x, double& y)
{double tmp = x;x = y;y = tmp;
}
void swap(char& x, char& y)
{char tmp = x;x = y;y = tmp;
}
// ……

通过函数重载是可以很好的解决这个问题,但是这样是否未免太过于麻烦了?很显然地有很大的缺陷:

  • 重载的函数仅仅是类型不同,代码复用率比较低。如果有新类型出现时,就需要用户自己增加对应的函数。
  • 函数的维护成本高,当一个函数出现问题过后,对于另外的同类函数也需要跟着修改……

对于这样的问题C++提出了一个新的语法:模板。就好像给出一个模具,想要什么“属性”的物体,直接往模具上套就可以了。

泛型编程:编写与类型无关的通用代码,是代码复用的一种手段!模板就是泛型编程的基础

模板分为:

  • 函数模板
  • 类模板

2. 模板的类别

模板主要运用在

  1. 函数模板
  2. 类模板

这也是我们主要介绍的语法。关于模板的实例化,我们在第三节进行细致的讲解。在这里主要介绍语法,搭建框架。

2.1 函数模板

语法如下:

template<class T>  // 这个也可以是:template<typename T>
// …… 函数声明 + 函数定义

对于上面所述的交换函数,例2.1:

template<class T>
void swap(T& x, T& y) 
{T tmp = x;x = y;y = tmp;
}

这里声明模板关键字:template<type_parameter list>模板参数列表每一个被作为类型的标识符(就像函数形参名一样)都需要前面带一个关键字:class/typename。模板参数列表当然可以不止一个。例2.2:

template<class T1, typename T2>
void func(T1 x, T2 y) 
{// 业务处理
}

注意:

引用和指针都需要指明用&和*指明类型。

  • 目的是:为了让编译器更好地识别和方便进行解引用。
    否则: 对于引用来说,编译器不会把它识别为引用,而是普通的值传递;对于指针 来说,如果想得到参数解引用过后的值,请把函数参数带上*指明指针类型。上面的例2.1和2.2已经给出了作为引用的例子了,下面给出一个指针的例子。

例2.3:

template<class T>
void swap(T* x, T* y) 
{T tmp = *x;*x = *y;*y = tmp;
}
这样才能更好地实现函数体。

const也可以作为函数参数的一部分

例2.4:

template<class T1, typename T2>
void func(const T1 x, const T2 y) 
{// 业务处理
}
关于这个例子,稍后在实例化(第三节)的时候进行讲解!

2.2 类模板

先给出语法:

template<class T1, class T2, ..., class Tn> //类型参数列表
class class_name
{
// 类内成员定义
}

对于自定义类型来说,有了类模板简直是如虎添翼。让代码得到了极大地复用
考虑如下场景:现在我要创建intchardouble三个类型的顺序表(vector)……
如果不使用类模板的代码就不再演示了,给出采用类模板进行的编写的代码
例2.5:

template<class T>
class Vector
{
public :Vector(size_t capacity = 10): _pData(new T[capacity]), _size(0), _capacity(capacity){}// 使用析构函数演示:在类中声明,在类外定义。
~Vector();void PushBack(const T& data)void PopBack()// ...size_t Size() {return _size;}T& operator[](size_t pos){assert(pos < _size);return _pData[pos];}
private:T* _pData;size_t _size;size_t _capacity;
};// 注意:类模板中函数放在类外进行定义时,需要加模板参数列表
template <class T>
Vector<T>::~Vector()
{
if(_pData)
delete[] _pData;
_size = _capacity = 0;
}

那我们在使用的时候就可以直接根据不同的类型进行创建不同的vector了!

注意:

类模板的类名不再是纯粹的类名了

  • 例如上面的class vector中的vector不再是类名了,而vector<T>才是这个类的类名。因为类模板类名不是真正的类,只有实例化过后的类才是真正的类!

类模板的方法是可以分离于类域的

  • 但是在类域外部进行定义的时候要指明类域:类名<T> 。同时记得继续带上关键字template!因为template管辖的范围只有紧接着函数或者类。(不可以一个template关键字给多个函数或者模板)

不要尝试将类模板分文件编译

  • 这个问题值得重视!不仅仅是类模板,同时还有函数模板。在C++模板下篇小编会和大家一起探讨。

3. 模板的实例化

在第二节中主要讲解了模板的框架搭建,这里主要讲解如何进行操作了。

对于实例化而言,主要分为两种:

  1. 隐式实例化
  2. 显示实例化

主要运用

  • 函数模板:隐式实例化、显示实例化
  • 类模板:显示实例化

3.1 函数模板的实例化

3.1.1 隐式实例化

来看上面的例2.1

#include<iostream>
using namespace std;
template<class T>
void myswap(T& x, T& y) //因为std标准库中有swap实现,这里做一个区分 
{T tmp = x;x = y;y = tmp;
}int main()
{int a = 10, b = 20;printf("交换之前:a = %d, b = %d\n", a, b); //printf还是挺方便的,哈哈哈myswap(a, b);printf("交换之前:a = %d, b = %d\n", a, b);return 0;
}

运行这个程序,结局也如我们所愿。可是总有些人动一些歪脑筋
例3.1:

#include<iostream>
using namespace std;
template<class T>
void myswap(T& x, T& y)
{T tmp = x;x = y;y = tmp;
}int main()
{int a = 10;double b = 1.0;printf("交换之前:a = %d, b = %d\n", a, b);//myswap(a, b); // 很不幸,这是错误的!printf("交换之前:a = %d, b = %d\n", a, b);return 0;
}

在这里插入图片描述

为什么编译器会报错呢?

在这里先浅浅地谈一下编译器实例化的原理

* 编译器实例化原理

来看这样一个例子
例 *.1:

#include<iostream>
using namespace std;
template<class T>
void myswap(T& x, T& y)
{T tmp = x;x = y;y = tmp;
}int main()
{int a = 10, b = 20;myswap(a, b);double m = 1.0, n = 2.1;myswap(m, n);char x = 'a', y = 'b';myswap(x, y); return 0;
}

查看这个程序的汇编代码
在这里插入图片描述

对比上面的函数名和函数地址,显然我们可以得到的是:
对于不同类型的参数调用的不是同一个函数!当然对于同一种类型,只需要生成一个函数即可

根据汇编我们大概了解了:

  • 编译阶段,编译器会根据函数模板实际出入的参数对函数模板进行推演,从而生成类型匹配的函数以供调用

    • 例如:在上面使用int的时候,编译器生成了一个myswap< int >的函数;还有myswap< double >myswap< char >

换句话说编译器帮我们完成了函数编写的工作。而我们只需要维护好这一份模板代码即可。

现在回到刚刚的问题:为什么编译器会报错呢?

  • 很显然地是:编译器无法推出类型来,从而实例化出函数!!但是,对于我们普通的函数而言是可以支持隐式类型转换的,但是模板是坚决不允许进行所谓的类型转换的

解决办法:

  1. 强制类型转换
  2. 显示实例化

这里先介绍强制类型转换:
例3.2:

#include<iostream>
using namespace std;
template<class T>
void myswap(T& x, T& y)
{T tmp = x;x = y;y = tmp;
}int main()
{int a = 10;double b = 1.0;printf("交换之前:a = %d, b = %d\n", a, b);myswap(a, (int)b); // 很不幸,还是错误的!printf("交换之前:a = %d, b = %d\n", a, b);return 0;
}

一脸笑意运行,突然发现,还是错误的……
在这里插入图片描述
为什么啊?

(int)b
给出下面的疑问:
  1. 这是一个什么行为?类型转换啊!
  2. 类型转换会干嘛?产生临时变量啊!
  3. 临时变量怎么了?具有常性啊!

这下知道了,原来是常性出了问题,意思就是需要给函数参数加一个const
(这里可以阅读我的另外一片关于类型转换细节的文章 链接:类型转换细节)

#include<iostream>
using namespace std;
template<class T>
void myswap(T& x, const T& y)
{T tmp = x;x = y;//y = tmp; //这就是不可以取的了
}int main()
{int a = 10;double b = 1.0;printf("交换之前:a = %d, b = %d\n", a, b);myswap(a, (int)b); // 很不幸,还是错误的!printf("交换之前:a = %d, b = %d\n", a, b);return 0;
}

对于这个函数而言就是无意义的,因为我需要改变值啊。但是这个细节需要注意!!

3.1.2 显示实例化

对于上面的问题,我们还有一个办法就是:显示实例化

例3.3:

#include<iostream>
using namespace std;
template<class T>
void myswap(T& x, T& y)
{T tmp = x;x = y;y = tmp;
}int main()
{int a = 10;double b = 1.0;printf("交换之前:a = %d, b = %d\n", a, b);myswap<int>(a, b);  //告诉编译器,我要使用intprintf("交换之前:a = %d, b = %d\n", a, b);return 0;
}

这样就十分可取了。告诉了编译器,我需要什么样子的函数了。

当然显示实例化肯定是有自己的用武之地的,考虑下面的场景:

例3.4:

template<class T>
T* Alloc(int n)
{T* ptr = new T[n];//开辟n个T类型的数据// …… 处理return ptr;
}int main()
{int* ptr1 = Alloc<int>(10); //需要int类型delete[] ptr1;           //不得不说这样的接口设计不好。只是为了举例子return 0;
}

显示实例化还有更多应用的场景!!

小编提出如下问题:我的函数模板会和我实际写的函数发生矛盾吗?

—不会

这里给出函数模板实例化和普通函数的存在性原则

  • 一个非模板函数和一个同名的模板函数可以同时存在,而且该函数模板还可以被实例化为这个非模板函数。
  • 对于非模板函数和同名的函数模板,如果其它条件都相同,在调用的时候会优先调用非模板函数而不会从该模板实例化一个模板函数。
    同时,如果模板可以生成一个具有更好匹配的函数,那么将选择模板。

3.2 类模板的实例化

关于类模板的实例化,一般都是显示实例化。因为类中的数据,根本不知道你需要什么样子的数据。
例3.6:

template<typename T>
class Stack
{
public:void Push(T x);Stack(int capacity = 4):_a(new T[capacity]), _capacity(capacity), _top(0){}~Stack(){delete[] _a;_capacity = 0;_top = 0;}Stack(const Stack& st):_capacity(st._capacity),_top(st._top){_a = new T[st._capacity];memcpy(_a.st._a, sizeof(T) * st._capacity);}
private:T* _a;int _capacity;int _top;
};template<typename T>
void Stack<T>::Push(T x)
{_a[_top++] = x;
}int main()
{Stack<int> st1; //存放int类型Stack<char> st2; // 存放char类型Stack<vector<int>> st3; //存放自定义类型// ...return 0;
}

我们下篇再见!!

相关文章:

C++模板【上篇】 —详解模板基础语法

文章目录 前言1. 泛型编程2. 模板的类别2.1 函数模板2.2 类模板 3. 模板的实例化3.1 函数模板的实例化3.1.1 隐式实例化* 编译器实例化原理3.1.2 显示实例化 3.2 类模板的实例化 前言 在这篇文章中&#xff0c;主要介绍一些模板的基础的语法和一些细节&#xff0c;同时了解泛型…...

谈谈Redis缓存和数据库一致性

目录 1、缓存问题 2、更新缓存 3、删除缓存 4、最终方案 5、缓存分类 5.1、缓存穿透 5.2、缓存击穿 5.2、缓存雪崩 6、示例 前言 Redis 作为缓存与数据库之间的通信模式能够显著提升系统性能&#xff0c;减少数据库的压力。 通过合理使用 Redis 进行数据存取&#xff…...

JWT深度解析:现代Web身份验证的通行证-优雅草卓伊凡

# JWT深度解析&#xff1a;现代Web身份验证的通行证 ## 一、JWT的本质与构成 ### 1.1 JWT的定义解析 JWT&#xff08;JSON Web Token&#xff09;是一种**开放标准&#xff08;RFC 7519&#xff09;**&#xff0c;用于在各方之间安全地传输信息作为JSON对象。这种信息可以被…...

VTK|.obj文件数据处理+Jet/Viridis/CoolToWarm/Grayscale/Rainbow/风格颜色渲染

文章目录 处理OBJ文件Jet渲染风格Viridis渲染风格CoolToWarm渲染风格Grayscale渲染风格Rainbow渲染风格切换风格按钮槽函数&#xff08;可优化&#xff09;相关代码github链接 将 .obj 数据进行 Elevation 着色并可视化渲染的完整流程 和.ply文件处理方式一样 处理OBJ文件 vo…...

如何通过服务主体获取 Azure 凭据

本文详细讲解如何通过 Azure 服务主体生成凭据,使应用程序能够安全访问 Azure 资源(如部署 Container Apps)。以下步骤基于 Azure Portal 操作,适用于自动化部署、CI/CD 等场景。 步骤 1:登录 Azure Portal 访问 Azure 门户。使用 Azure 账户(需具备订阅管理员权限)登录…...

Kubernetes探针生产环境实战指南

一、探针的本质&#xff1a;应用健康的智能体检系统 想象你的应用是一个高空走钢丝的演员&#xff0c;Kubernetes探针就像三位安全员&#xff1a; 启动探针&#xff1a;检查演员是否站稳&#xff08;应用是否完成初始化&#xff09;就绪探针&#xff1a;确认演员准备好表演&a…...

node.js 实战——express图片保存到本地或服务器(七牛云、腾讯云、阿里云)

本地 ✅ 使用formidable 读取表单内容 npm i formidable ✅ 使用mime-types 获取图片后缀 npm install mime-types✅ js 中提交form表单 document.getElementById(uploadForm).addEventListener(submit, function(e){e.preventDefault();const blob preview._blob;if(!blob)…...

线代第二章矩阵第五、六、七节矩阵的转置、方阵的行列式、方阵的伴随矩阵

文章目录 矩阵的转置转置性质对称矩阵与反对称矩阵 方阵的行列式方阵的伴随矩阵&#xff08;重要&#xff09; 矩阵的转置 转置性质 &#xff08;1&#xff09; &#xff08;2&#xff09; &#xff08;3&#xff09; &#xff08;4&#xff09;注意这个&#xff1a; 扩展&a…...

经验:从CAN到以太网为主的车载网络架构升级

引言 新能源汽车智能化与网联化的进程中&#xff0c;传统CAN总线已难以满足高带宽、低延迟的通信需求&#xff0c;车载以太网逐步成为新一代电子架构的核心骨干。本文基于工程实践&#xff0c;系统性解析车载以太网的核心技术、协议栈、拓扑设计及工具链升级策略&#xff0c;助…...

基于FPGA婴儿安全监护系统(蓝牙小程序监测)

基于FPGA婴儿安全监护系统 前言一、芯片手册阅读二、代码分析1.温湿度驱动2.转速等级设置模块3.电机转速控制模块 总结视频演示 前言 实时监测车内温湿度数据&#xff08;DTH11温湿度模块&#xff09;----实时控制风扇驱动速度&#xff08;结合温湿度进行控制&#xff09;----…...

嵌入式 C 语言控制语句

目录 1. 控制语句 2. 分支语句 2.1 if else 2.2 switch 3. 循环语句 3.1 goto 3.2 while 循环 3.3 do while 循环 3.4 for 循环 3.5 例题 3.6 循环控制语句 3.6.1 break 3.6.2 continue 1. 控制语句 控制语句分为&#xff1a;顺序语句&#xff0c;分支语句&#xff0…...

leaflet-velocity风场粒子效果及数据处理

一&#xff0c;后台给到的数据 {"msg": "success","code": 200,"data": {"startLat": 39.3,"endlat": 41.2,"latdel": 0.099999994,"startLon": 115.3,"endLon": 117.50001,"…...

React 实现 JWT 登录验证的最小可运行示例

下面是一个用 React 实现 JWT 登录验证的最小可运行示例&#xff0c;包含&#xff1a; React 前端&#xff1a;登录、保存 Token、获取用户数据。模拟后端&#xff1a;用 mock API&#xff08;你也可以接真后端&#xff09;。 &#x1f9f1; 技术栈 React&#xff08;使用 Vi…...

MySQL报错解决过程

我在调试datagrip的时候&#xff0c;显示拒绝连接&#xff0c;开始的时候&#xff0c;我以为只是服务没有开启&#xff0c;结果到后来在网上搜索各种解决办法无果后&#xff0c;就选择卸载&#xff0c;卸载之后安装新的MySQL 以下就是我的解决过程。 如果只是在使用外置软件&…...

更多 QVariant 使用案例

以下是 QVariant 的其他典型应用场景及代码示例&#xff0c;涵盖更多实际开发需求&#xff1a; 6. 数据库查询结果处理 处理数据库字段的异构数据类型&#xff08;如整数、字符串、日期等&#xff09;&#xff1a; QSqlQuery query; query.exec("SELECT name, age, crea…...

WPF中解决数据绑定不匹配的问题

在 WPF 开发中&#xff0c;IValueConverter 和 IMultiValueConverter 接口是非常实用的工具&#xff0c;它们允许你在数据绑定过程中对数据进行转换。 IValueConverter 接口示例 IValueConverter 接口用于单值转换&#xff0c;它包含 Convert 和 ConvertBack 两个方法。Conve…...

学习Cesium Entities

🌐 Cesium中的Entities系统趣味学习 📊 Entities系统架构流程图 #mermaid-svg-Lkue5O3gYOkEVSbD {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Lkue5O3gYOkEVSbD .error-icon{fill:#552222;}#mermaid-svg-Lku…...

Spark处理过程-案例数据清洗

&#xff08;一&#xff09;需求说明 准备十条符合包含用户信息的文本文件&#xff0c;每行格式为 姓名,年龄,性别&#xff0c;需要清洗掉年龄为空或者非数字的行。 例如&#xff1a; 张三,25,男 李四,,女 王五,30,男 赵六,a,女 孙七,35,男 周八,40,女 吴九,abc,男 郑十,45,女…...

【AI提示词】马斯洛需求分析专家

提示说明 专业的心理学需求分析专家&#xff0c;熟悉马斯洛需求层次理论及其在不同文化背景下的适用性。 提示词 # Role: 马斯洛需求分析专家## Profile - language: 中文 - description: 专业的心理学需求分析专家&#xff0c;熟悉马斯洛需求层次理论及其在不同文化背景下的…...

【WebRTC-13】是在哪,什么时候,创建编解码器?

Android-RTC系列软重启&#xff0c;改变以往细读源代码的方式 改为 带上实际问题分析代码。增加实用性&#xff0c;方便形成肌肉记忆。同时不分种类、不分难易程度&#xff0c;在线征集问题切入点。 问题&#xff1a;编解码器的关键实体类是什么&#xff1f;在哪里&什么时候…...

Kuikly 安装环境篇

1、安装版本号为2024.1.1 的Android studio&#xff08;如使用高版本的Android studio需要更改JDK版本号为17&#xff09; 2、JDK版本使用17&#xff08;如需要修改JDK&#xff1a;Android Studio -> Settings -> Build,Execution,Deployment -> Build Tools -> Gr…...

npm create vite@latest my-vue-app 解读

背景发荧光的样式。 filter属性的学习&#xff1a;filter - CSS&#xff1a;层叠样式表 | MDN 复习一下em 组件的调用: 是msg让“ViteVue”显示出来的&#xff01;&#xff01; a标签的targte属性&#xff1a; 组件之间怎么传值的&#xff1a; &#xff0c;没看懂code标签怎么…...

【本地搭建npm私服】使用Verdaccio

使用Verdaccio搭建本地NPM私服及私有包管理指南 一、Verdaccio安装与基础配置 1. 安装Verdaccio # 全局安装Verdaccio npm install -g verdaccio# 检查版本 verdaccio --version2. 启动服务 verdaccio启动后默认监听4873端口&#xff0c;访问 http://localhost:4873 3. 配…...

Chroma:一个开源的8.9B文生图模型

Chroma 模型讲解 一、模型概述 Chroma 是一个基于 FLUX.1-schnell 的 8.9B 参数模型。它采用了 Apache 2.0 许可证&#xff0c;完全开源&#xff0c;允许任何人使用、修改和在其基础上进行开发&#xff0c;不存在企业限制。该模型目前正在训练中&#xff0c;训练数据集从 20M…...

量子通信技术及其在信息安全中的应用:开启无条件安全通信的新时代

前言 在数字化时代&#xff0c;信息安全是全球关注的焦点。随着传统加密技术面临量子计算等新兴技术的挑战&#xff0c;量子通信作为一种基于量子力学原理的新型通信技术&#xff0c;因其无条件安全的特性而备受关注。量子通信不仅能够有效抵御量子计算的威胁&#xff0c;还能为…...

【杂谈】Godot 2D游戏窗口设置

如切如磋&#xff0c;如琢如磨。 目录 一、引言二、设置&#xff08;一&#xff09;基本尺寸&#xff08;二&#xff09;拉伸&#xff08;三&#xff09;手持设备朝向&#xff08;四&#xff09;​​窗口模式​​ 一、引言 在开发2D游戏时&#xff0c;​​窗口尺寸的设定是游戏…...

MySQL 8.0 OCP认证考试题库持续更新

MySQL是属于甲骨文Oracle公司的一个世界知名的免费数据库产品&#xff0c;使用的范围广、企业多、人员也多&#xff0c;所以对MySQL认证关注的人也不少&#xff0c;MySQL的证书与Oracle的证书使用的是同一个模板&#xff0c;只是在内部的介绍上稍有不同&#xff0c;MySQL认证考…...

C++GO语言微服务基础技术②

目录 01 protobuf语法回顾 02 protobuf的编译、和其他序列化比较 03 查看protoc编译文件对比自定义封装 04 grpc安装简介 05 grpc服务远程调用作业布置 06 作业-grpc-server端 07 作业-grpc-client端 01 protobuf语法回顾 ## 编译 protobuf> 回顾&#xff1a;C 编译 …...

【使用switch结构输出季节】2021-11-23

缘由用switch语句设计程序一年有12个月-编程语言-CSDN问答 void 使用switch结构输出季节(int y) {//缘由https://ask.csdn.net/questions/7577096?spm1005.2025.3001.5141std::cout << y << "\t";switch (y){case 3: case 4: case 5:std::cout <<…...

【Bootstrap V4系列】学习入门教程之 组件-下拉菜单(Dropdowns)

Bootstrap V4系列 学习入门教程之 组件-下拉菜单&#xff08;Dropdowns&#xff09; 下拉菜单&#xff08;Dropdowns&#xff09;一、Overview 概述二、Accessibility 可访问性三、Examples3.1 Single button 单按钮3.2 Split button 分割按钮 四、Sizing 尺寸 下拉菜单&#x…...

基础编程题目集 6-8 简单阶乘计算

本题要求实现一个计算非负整数阶乘的简单函数。 函数接口定义&#xff1a; int Factorial( const int N ); 其中N是用户传入的参数&#xff0c;其值不超过12。如果N是非负整数&#xff0c;则该函数必须返回N的阶乘&#xff0c;否则返回0。 裁判测试程序样例&#xff1a; #in…...

解决word里插入公式后打不开的问题

小铃铛最近在写毕业论文了&#xff0c;需要在文档里插入公式&#xff0c;然鹅一插入就卡死了&#xff0c;直接关闭文档后就再也打不开了&#xff0c;报错什么确定磁盘有空间&#xff08;&#xff1f;总之就是文档损坏的意思&#xff09; 这个时候不要慌&#xff0c;先把word后缀…...

android studio开发:设置屏幕朝向为竖屏,强制应用的包体始终以竖屏(纵向)展示

在 Android 中&#xff0c;要强制应用的包体始终以竖屏&#xff08;纵向&#xff09;展示&#xff0c;可以通过以下几种方式来实现&#xff1a; ✅ 方式一&#xff1a; 在 AndroidManifest.xml 中设置 Activity 的方向&#xff0c;这是最常用的方法。对所有需要强制竖屏的 Ac…...

中国自动驾驶研发解决方案,第一!

4月28日&#xff0c;IDC《中国汽车云市场(2024下半年)跟踪》报告发布&#xff0c;2024下半年中国汽车云市场整体规模达到65.1亿元人民币&#xff0c;同比增长27.4%。IDC认为&#xff0c;自动驾驶技术深化与生成式AI的发展将为汽车云打开新的成长天花板&#xff0c;推动云计算在…...

OpenCv实战笔记(3)基于opencv实现调用摄像头并实时显示画面

一、实现效果 二、实现原理 使用 OpenCV 打开摄像头&#xff0c;持续捕获视频帧&#xff0c;并在一个窗口中实时显示这些帧&#xff0c;直到用户按下 ESC 键退出。整体流程&#xff1a;打开摄像头&#xff08;cv::VideoCapture&#xff09;>创建图像显示窗口&#xff08;cv…...

SpringBoot3 + Druid + DynamicDataSource + PgSQL 连接池优化方案

问题描述 使用 SpringBoot Druid DynamicDataSource PgSQL 时遇到的连接过多未释放问题&#xff0c;一方面是升级DB Core对DB做Tuning&#xff0c;另一方面是优化Druid数据库连接池方案。 关键优化方向 连接泄漏检测与回收 连接有效性验证 合理的连接池大小配置 闲置连接…...

C++ 深入解析 数据结构中的 AVL树的插入 涉及的旋转规则

欢迎来到干货小仓库 "普通程序员Google 超级程序员" 1、AVL 树的概念 二叉搜索树虽可以缩短查找的效率&#xff0c;但如果数据有序或接近有序二叉搜索树将退化为单支树&#xff0c;查找元素相当于在顺序表中搜索元素&#xff0c;效率低下。 例如在这种情况下&…...

c++中的引用

1&#xff0c;引用的基本使用&#xff1a; 作用&#xff1a;给变量起别名 语法&#xff1a;数据类型 &别名 原名 #include<iostream> using namespace std; int main() {int a10;int &ba;cout<<"a "<<a<<endl;cout<<&quo…...

零拷贝的简单复习

PageCache PageCache是内核缓冲区 DMA 没有DMA前的IO&#xff1a;整个数据的传输过程&#xff0c;都需要 CPU 亲自参与搬运数据的过程&#xff0c;而且这个过程中CPU 是不能做其他事情的 CPU发起IO 磁盘将数据放到磁盘缓冲区 CPU将磁盘缓冲区数据放到内核缓冲区 CPU将内核缓…...

CCF编程能力等级认证 一级 第一次课

介绍 CCF 编程能力等级认证&#xff08;GESP&#xff09;为青少年计算机和编程学习者提供学业能力验证的规则和平台&#xff0c;由中国计算机学会发起并主办。 每年考试分四次&#xff0c;时间是每年的3月、6月、9月、12月&#xff0c;以当年每期公布的时间为准。 GESP适用年…...

芯片测试之Open-Short Test全解析:从原理到实战

大家好&#xff0c;我是硅言。最近在开发NORD的AC、DC测试程序&#xff0c;准备和大家聊聊NOR Flash一套完整的AC、DC测试&#xff0c;要测哪些参数&#xff0c;如何测试等等。​​OS测试&#xff08;Open-Short Test&#xff0c;开短路测试&#xff09;​​作为芯片测试"…...

文件包含 任意文件读取

文件处理漏洞--文件包含 - wizard骑士 - 博客园 1&#xff0c;什么是文件包含 程序开发人员一般会吧重复使用的函数写道单个文件中&#xff0c;需要使用某个函数时直接调用此文件&#xff0c;无需再次编写&#xff0c;文件调用的过程就是文件包含&#xff0c;所以将包含的文件…...

string[字符串中第一个的唯一字符][蓝桥杯]

使用哈希表解决 class Solution { public:int firstUniqChar(string s) {int arr[26];for(int i0;i<s.size();i){arr[s[i]-a];}for(int i0;i<s.size();i){if(arr[s[i]-a]1)return i;}return -1;} };...

sql server限制用户只能访问特定表

一个老系统的sqlserver 数据库需要新建一个用户&#xff0c;并限制这个新用户只能访问指定的几个数据表。 1.夺权 创建用户简单&#xff0c;但是登录用户没有管理权&#xff0c;windows管理员登录用户也没有管理权限&#xff0c;这就需要夺权&#xff0c;在单用户模式下&…...

中级网络工程师知识点2

1.netstat -r:显示路由表信息 netstat -a:显示所有活动的TCP连接数以及计算机正在监听的TCP和UDP端口 netstat -e:显示以太网统计信息 netstat -n:以数字形式显示网络地址和端口号 2.display multicast forwarding-table 命令的作用是查看组播转发表信息。 display multic…...

SQL常用操作大全:复制表、跨库查询、删除重复数据

大家好&#xff0c;欢迎来到程序视点&#xff01;我是你们的老朋友.小二&#xff01; SQL常用操作精华总结 表结构与数据操作 复制表结构&#xff1a; SELECT * INTO b FROM a WHERE 1<>1 (SQL Server专用) SELECT TOP 0 * INTO b FROM a (更通用) 拷贝表数据&#…...

辰鳗科技朱越洋:紧扣时代契机,全力投身能源转型战略赛道

国家能源局于4月28日出台的《关于促进能源领域民营经济发展若干举措的通知》&#xff08;以下简称《通知》&#xff09;&#xff0c;是继2月民营企业座谈会后深化能源领域市场化改革的关键政策&#xff0c;标志着民营经济在“双碳”目标引领下正式进入能源转型的核心赛道。 自…...

java 破解aspose.words 18.6 使用

资源包&#xff1a;https://download.csdn.net/download/qq_36598111/90787167 jar包是破解过的&#xff0c;直接可以使用。 引入jar&#xff0c;要引入本地的&#xff0c;不要直接引入仓库的 <dependency><groupId>com.aspose</groupId><artifactId>…...

基于鸢尾花(Iris)数据集的分类模型

本文适合初学者入门&#xff0c;涵盖了数据加载、预处理、建模、训练和评估的全过程。 &#x1f3af; 项目目标 使用机器学习算法&#xff08;如K近邻KNN&#xff09;对鸢尾花的品种进行分类。 &#x1f9f0; 所需工具 Python 3.x 安装的库&#xff1a; pip install scikit…...

电容知识小结

1.同样是电容&#xff0c;1uf的陶瓷电容和1uf的铝电解电容是不一样的&#xff1b; 2.实际的电容等效为ESR C ESL;ESR等效电阻和ESL等效电感&#xff1b; 3.铝电解电容&#xff0c;瓷片电容和钽电容。 4.电容是容纳和释放电荷的电子器件&#xff1b; 5.电容的工作&#xff1a;…...