【C++】特化妙技与分文件编写 “雷区”
目录
- 目录
- 非类型模板参数
- 非类型模板参数vs宏代换
- 模板的特化
- 函数模板的特化
- 函数模板特化的坑
- 类模板特化
- 全特化
- 偏特化
- 模板分离编译
- 原理
- 解决方案
- end
目录
非类型模板参数
模板参数可分为类型形参和非类型形参。
- 类型形参: 出现在模板参数列表中,跟在class或typename关键字之后的参数类型名称。
- 非类型形参: 用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用。
例如,我们要实现一个静态数组的类,就需要用到非类型模板参数。
template<class T, size_t N> //N:非类型模板参数
class StaticArray
{
public:size_t arraysize(){return N;}
private:T _array[N]; //利用非类型模板参数指定静态数组的大小
};
使用非类型模板参数后,我们就可以在实例化对象的时候指定所要创建的静态数组的大小了。
int main()
{StaticArray<int, 10> a1; //定义一个大小为10的静态数组cout << a1.arraysize() << endl; //10StaticArray<int, 100> a2; //定义一个大小为100的静态数组cout << a2.arraysize() << endl; //100return 0;
}
注意:非类型参数C++11只支持整形,C++20支持浮点数,所以到现在只支持这两个类型
非类型模板参数vs宏代换
这里我们回顾一下在C语言中我们学过一个叫宏的东西。
#include<iostream>
using namespace std;
#define N 10
int main()
{int a[N] = { 0 };cout << sizeof(a) / sizeof(a[0]) << endl;return 0;
}
- 这里就是把数组的长度位置方式N这个宏,然后在预处理的阶段替换为宏的常量10,所以我们计算出数组的长度就是10.
- 那接下来我们把上面静态数组的类也用宏来替换如何?
#include<iostream>
#define N 10
using namespace std;
template<class T> //N:非类型模板参数
class StaticArray
{
public:size_t arraysize(){return N;}
private:T _array[N]; //利用非类型模板参数指定静态数组的大小
};
int main()
{cout << StaticArray<int>().arraysize() << endl;return 0;
}
- 可以看到确实是10这个长度
- 但是现在我们还想实例化出一个20长度的数组可以吗,是不是不行了,因为我们只有一个模板参数
- 所以宏和非类型模板参数相比,宏才固定死板了。
模板的特化
- 我们通过一个例子来引出特化
bool IsEqual(T x, T y)
{return x == y;
}
- 比如说这里我要判断两个变量是否相等。
cout << IsEqual(1, 1) << endl; //1
cout << IsEqual(1.1, 2.2) << endl; //0
- 嗯,这样写确实可以判断两个变量的值是否想等。我们这个函数模板好像可以完成所有的任务
- 它的判断结果也是我们所预期的,但是我们也可能会这样去使用该函数模板:
char a1[] = "hehe";
char a2[] = "hehe";
cout << IsEqual(a1, a2) << endl; //0
- 这里我们的本意是判断两个字符串是否相等,但是传了两个数组的地址,那我们比较的就是两个数组的地址是否相等,结构肯定是不符合预期的两个地址肯定不相等,但是我们肉眼看到,字符串值是相等的。
函数模板的特化
对于上述实例,我们知道当传入的类型是char时,应该依次比较各个字符的ASCII码值进而判断两个字符串是否相等,或是直接调用strcmp函数进行字符串比较,那么此时我们就可以对char类型进行特殊化的实现。
1.首先必须要有一个基础的函数模板。
2.关键字template后面接一对空的尖括号<>。
3.函数名后跟一对尖括号,尖括号中指定需要特化的类型。
4.函数形参表必须要和模板函数的基础参数类型完全相同,否则不同的编译器可能会报一些奇怪的错误。
- 对于上述实例char*类型的特化如下:
//基础的函数模板
template<class T>
bool IsEqual(T x, T y)
{return x == y;
}
//对于char*类型的特化
template<>
bool IsEqual<char*>(char* x, char* y)
{return strcmp(x, y) == 0;
}
函数模板特化的坑
- 通过上面的例子,好像函数模板特化很有用,但是我们真的要多使用他吗?
- 现在我期望按照p1和p2的值来比较,但是我原来的函数模板如下图,不支持这样比较,因为new出来的空间是随机的,那么指针值(指向空间地址)也是随机的, 那么结果也是随机的
我们现在希望按照指向空间的值来比较,所以我们现在可以使用模板特化
- 为了不改变指针的值,我们应该对他加上const
- 但是这里,并不能编译成功,因为我们的const在之前限定的是left(指向空间的值),正确写法应该是在*之后,修饰指针变量本身(指向的空间),所以这里很容易出错,而且还有比这个情况更复杂的情况
综上写一个小小的函数模板特化稍不注意就有一个坑,如果在大型项目里面坑还要多,这个时候我们再来Debug就够痛苦了
- 那有同学问,那还有什么办法,不用特化还能有什么方法可以按照我的意思来处理同一个函数的不同功能。
- 有的兄弟有的,这个时候,我们回忆一下,如果函数模板和重载的普通函数同时存在,如果那个同名的函数是刚好完全匹配我们模板想要实例化的类型,我们模板有现成吃现成
类模板特化
类模板的特化步骤:
1 . 首先必须要有一个基础的类模板。
2.关键字template后面接一对空的尖括号<>。
3.类名后跟一对尖括号,尖括号中指定需要特化的类型。
全特化
全特化即是将模板参数列表中所有的参数都确定化。
//普通模板
template<class T1, class T2>
class Data
{
public:
Data() {cout<<"Data<T1, T2>" <<endl;}
private:
T1 _d1;
T2 _d2;
};//全特化
template<>
class Data<int, char>
{
public:
Data() {cout<<"Data<int, char>" <<endl;}
private:
int _d1;
char _d2;
};
void TestVector()
{
Data<int, int> d1;
Data<int, char> d2;
}
- 当T1和T2分别是int和char时,我们若是想对实例化的类进行特殊化处理,那么我们就可以对T1和T2分别是double和int时的模板进行特化。
偏特化
- 偏特化是指任何针对模板参数进一步进行条件限制设计的特化版本。
例如,对于以下类模板:
template<class T1, class T2>
class Date
{
public://构造函数Date(){cout << "Date<T1, T2>" << endl;}
private:T1 _D1;T2 _D2;
};
偏特化又可分为以下两种表现形式:
1、部分特化
我们可以仅对模板参数列表中的部分参数进行确定化。
例如,我们可以对T1为int类型的类进行特殊化处理。
//对T1为int的类进行特化
template<class T2>
class Date<int, T2>
{
public://构造函数Date(){cout << "Date<int, T2>" << endl;}
private:int _D1;T2 _D2;
};
- 此时只要实例化对象时指定T1为int,就会使用这个特化的类模板来实例化对象。所以d2即使两参数一样,也是匹配第二个特化
2、参数更进一步的限制
偏特化并不仅仅是指特化部分参数,而是针对模板参数进一步的条件限制所设计出来的一个特化版本。
例如,我们还可以指定当T1和T2为某种类型时,使用我们特殊化的类模板。
//两个参数偏特化为指针类型
template<class T1, class T2>
class Dragon<T1*, T2*>
{
public://构造函数Dragon(){cout << "Dragon<T1*, T2*>" << endl;}
private:T1 _D1;T2 _D2;
};
//两个参数偏特化为引用类型
template<class T1, class T2>
class Dragon<T1&, T2&>
{
public://构造函数Dragon(){cout << "Dragon<T1&, T2&>" << endl;}
private:T1 _D1;T2 _D2;
};
- 此时,当实例化对象的T1和T2同时为指针类型或同时为引用类型时,就会分别调用我们特化的两个类模板。
模板分离编译
原理
- 什么是分离编译
个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件链接起来形成单一的可执行文件的过程称为分离编译模式。
- 比如我们在string类里面,分文件编写string头文件和源文件,和测试test文件。这三个文件就会分离编译,
- 到后来vector我们用来模板就没有再进行分文件编写,不是不想用而是语法不行,今天我们就来搞清楚为什么不行。
- a.h文件
- 先补充一下:test.cpp和a.cpp这两个文件在前面三步都是各做各的单向三步,在第四步才开始把他们链接起来
- 说一下前面四个步骤的第二步编译,C++语法允许test.i这个文件调用函数的时候如果函数没有定义但是有声明,编译器相信有这个函数,所以test.i成功通过了编译。到了第四步开始把所有文件进行链接的时候,那么编译器就要开始去寻找声明函数的地址完成调用了。这时候我们引出一个概念叫符号表,链接的时候编译器就从这里确定调用函数的地址
- 但是从运行结果来看,func可以链接成功,但是Add却无法连接成功,这是为啥呢?
就是因为模板的特性和前面三步的单向操作
我们看第一步预处理完后的两个文件的大致结果
- Func链接完后:
嗯,现在我需要去找一下我这个声明函数的地址完成调用,现在链接完了,有一个新文件test.i, 哦哟,原来我这个定义在这个文件里,函数名一样,返回值类型一样,形参类型一样上去问test.i中Add的定义。Add的定义一看,嗯,函数名,形参类型,返回值类型都和我一样,原来你就是我要找的声明。链接成功 - Add链接完后:
嗯,现在我需要去找一下我这个声明函数的地址完成调用,现在链接完了,有一个新文件test.i, 哦哟,原来我这个定义在这个文件里,函数名一样,返回值类型一样,形参类型一样上去问test.i中Add的定义。Add的定义一看,嗯,函数名的确和我一样,但是我的形参类型和返回值类型都是不确定的啊,我不知道我要找的那个声明是什么类型,我可不相信你说你是我的声明你就是,Add的声明也就无法完成实例化了。
这就是模板的特性造成无法确定类型,又恰好因为没确定类型,后面单向操作导致test.i有定义不知道初始化什么类型,a.i有类型缺无法实例化。
- 有的同学就说了,现在既然知道原因,模板的特性是无法改变的。那么能不能让a和test编译的时候交叉一样,让a.i中的模板定义去test.i文件中去看一下类型,是可以这么做,但是这只是两个文件,那么如果说文件多了呢?1000个,10000个,十万个呢?
那么编译都要编译半天,那还写什么代码,老板来看你,你在哪里玩,老板问你为啥不工作,你说,哎呀你看,在编译嘛,我没办法。那行嘛,这个项目马上工期要到了,客户会等你编译完嘛?
解决方案
第一个方法:
- 那现在我们又要实例double类型的呢?
第二个方法:
通俗一点,声明就是一个承诺,我现在要结婚买房了,但是钱还差5w,这时候你想起你的好哥们,让他借你5w,你哥们说好,我过几天就给你打过来(声明),这时候你就要等5天后去找他(链接);
第二种情况:
你哥们太关心你了,知道你还差钱,早偷偷的就把钱打给你了,这时候你还需要5天后去找他(链接)吗
end
感谢各位的阅读,希望对你们有帮助
相关文章:
【C++】特化妙技与分文件编写 “雷区”
目录 目录非类型模板参数非类型模板参数vs宏代换 模板的特化函数模板的特化函数模板特化的坑 类模板特化全特化偏特化 模板分离编译原理解决方案 end 目录 非类型模板参数 模板参数可分为类型形参和非类型形参。 类型形参: 出现在模板参数列表中,跟在…...
qt+mingw64+cmake+libqrencode项目编译和搭建成功记录
最近要使用高拍仪拍照获取照片,然后识别照片中的二维码数据、使用QZxing只能识别出一个条码、另外一个条码准备测试用其他的开源项目(如libqrencode-4.1.1)来进行测试,故进行本文的项目环境搭建测试,最后成功。 本机开…...
观察者设计模式详解:解耦通知机制的利器
在面向对象设计中,设计模式为我们提供了通用的解决方案,以应对常见的开发问题。观察者设计模式是其中非常经典且实用的一种模式,广泛应用于GUI系统、事件处理、消息推送等场景。今天,我们就深入探讨观察者模式的概念、结构和特点&…...
Vim使用完全指南:从基础到高效编辑
Vim使用完全指南:从基础到高效编辑 一、Vim简介与基本概念 Vim(Vi IMproved)是从vi发展出来的一个功能强大的文本编辑器,以其高效性和灵活性著称,特别适合程序开发和系统管理任务。与常规文本编辑器不同,…...
C语言——数组
在C语言中,数组是一组相同类型元素的集合,并且每个数据都有自己对应的一个序号,我们称之为数组下标或者索引。接下来我们就来看看数组是如何定义的吧! 目录 1.一维数组 1.1 定义与初始化 1.2 一维数组的使用 1.3 一维数组在内…...
电商|基于java+vue的农业电商系统(源码+数据库+文档)
农业电商系统 目录 基于java的农业电商系统 一、前言 二、系统设计 三、系统功能设计 系统功能实现 前台: 后台: 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍:✌️…...
ServletContextAttributeListener 的用法笔记250417
ServletContextAttributeListener 的用法笔记250417 以下是关于 ServletContextAttributeListener 的用法详解,涵盖核心方法、实现场景、注意事项及最佳实践,帮助您有效监听应用级别属性(ServletContext)的变化: 1. 核…...
iptables 防火墙
目录 熟悉Linux防火墙的表,链结构 理解数据包匹配的基本流程 学会编写iptables规则 前言 在当今信息化时代,网络安全已成为企业和个人不可忽视的重要议题。随着网络攻击手段的不断升级,构建一个坚固的网络安全防线显得尤为迫切。在Linux系统中,iptables作为一款…...
【厦门大学】DeepSeek大模型及其企业应用实践
DeepSeek大模型及其企业应用实践 前言1. 大模型:人工智能的前沿1.1 大模型的概念1.2 大模型的发展历程1.3 人工智能与大模型的关系1.4 大模型的分类 2. 大模型产品2.1 国外的大模型产品2.2 国内的大模型产品2.3 主流大模型“幻觉”评测 3. 大模型的行业应用3.1 自然…...
解锁智能制造:PLC远程下载如何让设备运维效率提升10倍?
一、2025年远程运维的三大变革驱动力 政策强制: 欧盟CE新规要求:2025年起工业设备必须具备远程审计接口 中国等保2.0:工业控制系统远程访问需达到三级防护 技术成熟: 5G专网边缘计算实现ms级响应 算法自动诊断PLC程序异常&#x…...
卷积神经网络CNN(李宏毅)
目录 怎么把一张影响当成一个模型输入? 同样的 pattern出现在图片不同的位置。 第三个问题:Pooling: 阿尔法Go是怎么下围棋的: CNN不能处理的问题 CNN专门用在影像辨识方面 怎么把一张影响当成一个模型输入? 一张…...
URL / GET请求 中文UTF-8编码JS转化
以长颈鹿为例 decodeURIComponent 将编码转为中文 encodeURIComponent 会对整个参数字符串转义(包括 :// 等符号)。 encodeURI 仅转义非合法 URL 字符(不转义 :/?& 等保留字符)。 decodeURIComponent("%E9%95%BF%E9…...
Flink 内部通信底层原理
Flink 集群内部节点之间的通信是用 Akka 实现,比如 JobManager 和 TaskManager 之间的通信。而 operator 之间的数据传输是用 Netty 实现。 RPC 框架是 Flink 任务运行的基础,Flink 整个 RPC 框架基于 Akka 实现。 一、相关概念 RPC(Remote Procedure Call) 概念 定义:…...
async-profiler火焰图找出耗CPU方法
事情起于开发应用对依赖的三方包(apache等等)进行了升级后(主要是升级spring),CPU的使用率较原来大幅提升,几个应用提升50%-100%。 查找半天,对比每次版本的cpu火焰图,看不出有什么…...
深入理解Qt状态机的应用
深入理解Qt状态机的应用 Chapter1 深入理解Qt状态机的应用(一)什么是有限状态机?状态机的组成应用示例交通信号控制灯系统简单在线购物流程系统 Qt状态机框架Qt状态机框架组成常用接口说明 应用示例源码 Chapter2 深入理解Qt状态机的应用&…...
Python入门安装和语法基础
1.Python简介 Python是解释型语言, ython就为我们提供了非常完善的基础代码库,覆盖了网络、文件、GUI、数据库、文本等大量内容,被形象地称作“内置电池(batteries included)”。用Python开发,许多功能不必从零编写&am…...
Windows 图形显示驱动开发-WDDM 1.2功能—Windows 8 中的 DirectX 功能改进(四)
一、无覆盖和放弃 在基于磁贴的延迟呈现 (TBDR) 体系结构上呈现内容: Direct3D 11.1 中的呈现目标现在可以使用一组新的资源 API 来支持放弃行为。 开发人员必须了解此功能,并调用额外的 Discard () 方法,以在 TBDR 体系结构 (更高效地运行…...
如何分析服务器日志以追踪黑客攻击行为
分析服务器日志是追踪黑客攻击行为的关键手段。通过系统性地检查日志文件,可以发现异常访问模式、入侵痕迹和后门活动。以下是详细的日志分析方法: 一、重点日志文件定位 Web服务器日志 Nginx: /var/log/nginx/access.log(访问日志࿰…...
React 对state进行保留和重置
对 state 进行保留和重置 各个组件的 state 是各自独立的。根据组件在 UI 树中的位置,React 可以跟踪哪些 state 属于哪个组件。你可以控制在重新渲染过程中何时对 state 进行保留和重置。 开发环境:Reacttsantd 学习内容 React 何时选择保留或重置状态…...
EmbeddingBag介绍与案例
我们可以用一个具体的例子来说明 EmbeddingBagCollection 的核心作用和它如何处理用户特征。假设我们的用户特征包括 “item_id” 和 “cate_id” 两个字段,每个字段都有各自的离散取值,也就是一些整数 ID。为了让模型能处理这些离散数据,我们…...
css button 点击效果
<!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><title>button点击效果</title><style>#container {display: flex;align-items: center;justify-content: center;}.pushable {position: relat…...
Missashe考研日记-day22
Missashe考研日记-day22 1 专业课408 学习时间:3h学习内容: 先把昨天关于进程调度的课后习题做了,然后花了挺长时间预习OS的最最最最重要的一部分——同步与互斥问题,这部分大二上课的时候就懵懵懂懂的,得认真再领悟…...
二十、FTP云盘
1、服务端 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <sys/types.h> #include <unistd.h> #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> #include <netinet/in.h>…...
SVM-RF回归预测matlab代码
数据为Excel股票预测数据。 数据集划分为训练集、验证集、测试集,比例为8:1:1 模块化结构: 代码将整个流程模块化,使得代码更易于理解和维护。不同功能的代码块被组织成函数或者独立的模块,使得代码逻辑清晰,结构化程…...
Lombok @Builder 注解的进阶玩法:自定义 Getter/Setter 方法全攻略
大家好呀!👋 今天我们来聊聊 Java 开发中超级实用的 Lombok 库,特别是它的 Builder 注解。很多小伙伴都用过 Builder 来简化对象的创建,但你们知道吗?当我们需要自定义 getter/setter 方法时,Builder 也能玩…...
C++每日训练 Day 16:构建 GUI 响应式信号机制(面向初学者)
📘 本篇我们将结合之前的 SignalHub 与 Dispatcher 机制,构建一个适合 GUI 场景的响应式信号系统。以按钮点击为例,构建一个跨线程安全的事件响应系统,配合协程挂起/恢复,让 UI 编程也能更优雅易读。本篇以通俗方式讲解…...
HCIP(OSPF )(2)
OSPF 公共报文头部 版本(8bit):目前常用版本为 2,用于标识 OSPF 协议版本。不同版本在功能特性和报文格式上可能存在差异,高版本通常会修复旧版本的漏洞、扩展功能,如支持更多类型的网络拓扑、增强安全性等…...
zynq7020 ubuntu_base 跟文件系统
整体流程 制作 ubuntu_base 镜像运行 petalinux 构建的 ramdisk 系统用 ramdisk 系统把 ubuntu_base 镜像烧录到 emmc从 emmc 跟文件系统 启动内核 制作 ubuntu_base 镜像 制作 ubuntu_base 镜像 sudo apt-get install qemu-user-static # 安装 q…...
51、Spring Boot 详细讲义(八) Spring Boot 与 NoSQL
3、 Elasticsearch 集成 3.1 Elasticsearch 概述 3.1.1 Elasticsearch 的核心概念 Elasticsearch 是一个开源的分布式搜索引擎,主要用于实时数据检索和分析。它的核心功能包括全文检索、结构化查询和分析大规模数据。 分布式搜索引擎: Elasticsearch 将数据分布存储在多个…...
什么是分库分表?
分库分表是一种数据库的分布式架构设计策略,以下是详细介绍: 概念 • 随着互联网的发展,数据量呈爆炸式增长,单个数据库服务器可能难以应对海量数据的存储和访问压力。分库分表就是将原本庞大的数据库拆分成多个小的数据库&#…...
如何让别人访问到自己本地项目?使用内网穿透工具简单操作下实现公网连接!
本地搭建服务器的系统项目网络地址,在没有公网IP使用的情况下,如何让局域网外别人访问到自己本地网站和应用呢?这里介绍一种通用的内网发布公网访问,且简便操作的内网穿透实现方法。 一、什么是内网穿透? 1. 先了解内…...
第一篇:linux之虚拟环境与centos安装
第一篇:linux之虚拟环境与centos安装 文章目录 第一篇:linux之虚拟环境与centos安装一、vmware安装二、centos安装1、centos虚拟环境安装2、centos操作系统配置3、常见问题解决 一、vmware安装 我们想要运行linux,需要先安装一个虚拟软件&am…...
Redis List 的详细介绍
Redis List 的详细介绍 以下是 Redis List 的详细介绍,从基础命令、内部编码和使用场景三个维度展开: 一、基础命令 Redis List 支持双向操作(头尾插入/删除),适用于队列、栈等场景,以下是核心命令分类&a…...
docker占用磁盘100%
1. 立即清理方案 快速清理命令 bash 复制 # 停止Docker服务 sudo systemctl stop docker# 清理所有无用数据(包括未使用的镜像、容器、网络和卷) sudo docker system prune -a --volumes# 重启Docker sudo systemctl start docker 手动清理overlay2…...
20250417-vue-条件插槽
有时候我们需要根据内容是否被传入了插槽来渲染某些内容。 你可以结合使用 $slot 属性与 v-if 来实现。 在下面的示例中,我们定义了一个卡片组件,它拥有三个条件插槽:header、footer 和 default。当 header、footer 或 default 的内容存在时…...
【Unity】UI点击事件处理器
目录 前言脚本 前言 在开发过程中,经常需要监听UI的点击事件,这里我给大家整理一下,脚本直接挂在需要监听的节点上即可。 脚本 using UnityEngine; using UnityEngine.Events; using UnityEngine.EventSystems;namespace GameLogic {/// &…...
阿里云服务器的docker环境安装nacos--实践
阿里云服务器的docker环境安装nacos–实践 前提先安装mysql数据库,mysql中创建nacos所需的表以下为阿里云服务器docker环境安装,需在安全组开放8848端口 1. 拉取nacos-server镜像 //最新版本nacos docker pull nacos/nacos-server//或者指定nacos版本…...
每日算法-链表(23.合并k个升序链表、25.k个一组翻转链表)
一.合并k个升序链表 1.1题目描述 1.2题解思路 解法一:小根堆 我们可以先定义一个小根堆,将k个指针的头结点如堆,每次取堆顶元素尾插到newhead中,然后再pop(),接着push堆顶原来堆顶元素的下一个节点 重点分析&#…...
数据结构——反射、枚举以及lambda表达式
1. 反射 Java的反射(reflection)机制是在运⾏时检查、访问和修改类、接⼝、字段和⽅法的机制;这种动态获取信息以及动态调⽤对象⽅法的功能称为java语⾔的反射(reflection)机制。 用途 1. 框架开发 2. 注解处理 3.…...
深入理解 HTML5 Web SQL 数据库:用法、现状与替代方案
一、引言 在 Web 开发的领域中,客户端存储一直是一个关键的话题。HTML5 带来了多种客户端存储的解决方案,其中 Web SQL 数据库曾经是一个备受关注的选项。尽管如今它已被废弃,但了解其原理、使用方法以及为何被替代,对于 Web 开发者来说仍然具有重要的意义。本文将深入探讨…...
系统架构设计(一):UML与软件架构
什么是系统架构设计? 系统架构设计是对系统高层结构和行为的描述,包括: 系统的各个模块(组件)模块之间的交互方式数据流动、控制流动技术选型与部署策略 系统架构常见的风格有: 分层架构(La…...
极狐GitLab 外部流水线验证功能解读
极狐GitLab 是 GitLab 在中国的发行版,关于中文参考文档和资料有: 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 外部流水线验证 (BASIC SELF) 您可以使用外部服务在创建流水线之前进行验证。 极狐GitLab 发送一个 POST 请求到外部服务的…...
MCP和A2A是什么?
MCP和A2A是什么? MCP(Model-Connect Protocol)和A2A(Agent-to-Agent)协议逐渐成为行业关注的焦点。这两个协议分别由Anthropic和谷歌推出,旨在提升智能体与外部工具、数据源及API资源的连接效率,…...
CNN卷积神经网络
一、什么是卷积神经网络(CNN) CNN(卷积神经网络)是一种专门用于处理图像的神经网络,尤其在图像识别任务中表现出色,例如识别手写数字。它通过多层结构逐步提取图像特征,最终输出识别结果。与传…...
生物信息学技能树(Bioinformatics)与学习路径
李升伟 整理 生物信息学是一门跨学科领域,涉及生物学、计算机科学以及统计学等多个方面。以下是关于生物信息学的学习路径及相关技能的详细介绍。 一、基础理论知识 1. 生物学基础知识 需要掌握分子生物学、遗传学、细胞生物学等相关概念。 对基因组结构、蛋白质…...
Obsidian无门槛简明教程
Obsidian简明教程 Markdown基本语法基本码字标题换行段落引用分割线代码块链接带名字的链接超链接插入图片 强调语法加粗斜体删除线高亮 列表有序列表无序列表任务列表 Obsidian核心用法软件基本使用安装仓库文件夹笔记编辑与查看 资源 核心插件双链标签 三方插件Various Compl…...
常用 Git 命令详解
Git 是一个强大的版本控制工具,广泛用于软件开发和团队协作中。掌握 Git 命令可以帮助开发者更高效地管理代码版本和项目进度。本文将介绍一些常用的 Git 命令,并提供示例以帮助你更好地理解和应用这些命令。 目录 常用命令 git clonegit stashgit pul…...
【HDFS入门】HDFS与Hadoop生态的深度集成:与YARN、MapReduce和Hive的协同工作原理
目录 引言 1 HDFS核心架构回顾 2 HDFS与YARN的集成 3 HDFS与MapReduce的协同 4 HDFS与Hive的集成 4.1 Hive架构与HDFS交互 4.2 Hive数据组织 4.3 Hive查询执行流程 5 HDFS在生态系统中的核心作用 6 性能优化实践 7 总结 引言 在大数据领域,Hadoop生态系统…...
多路由器通过三层交换机互相通讯(单臂路由+静态路由+默认路由版),通过三层交换机让pc端相互通讯
多路由器通过三层交换机互相通讯(单臂路由静态路由默认路由版) 先实现各个小框框里能够互通 哇咔 交换机1(二层交换机,可看配置单臂路由的文章) Switch>en Switch#conf t Switch(config)#int f0/1 Switch(config-if)#switchport access…...
电控---CMSIS概览
1. CMSIS库简介 CMSIS(Cortex Microcontroller Software Interface Standard,Cortex微控制器软件接口标准)是由ARM公司开发的一套标准化软件接口,旨在为基于ARM Cortex-M系列处理器(如Cortex-M0/M0/M3/M4/M7/M33等&am…...