【C++初阶】八、初识模板(泛型编程、函数模板、类模板)
=========================================================================
相关代码gitee自取:
C语言学习日记: 加油努力 (gitee.com)
=========================================================================
接上期:
【C++初阶】七、内存管理
(C/C++内存分布、C++内存管理方式、operator new / delete 函数、定位new表达式)
-CSDN博客
=========================================================================
目录
一 . 泛型编程
二 . 函数模板
函数模板的概念
函数模板的格式
函数模板的原理
函数模板的实例化
隐式实例化:
显式实例化:
模板参数的匹配原则
三 . 类模板
类模板的定义格式
类模板的实例化
图示 -- 以栈类为例:
本篇博客相关代码
Test.cpp文件 -- C++文件
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
一 . 泛型编程
- 我们以前写的函数一般都是针对某种类型的,如:实现两值交换Swap函数,
如果交换的两值是int类型,那就要将Swap函数的参数设置为int类型;
如果交换的两值是double类型,那就要将Swap函数的参数设置为double类型……
(通过函数重载实现)
对于函数,虽然函数重载可以实现函数参数多类型的问题,
但也有一些不好的地方:
1、重载的函数仅仅是类型不同而已,具体实现和实现逻辑都是很类似的,
当接收的函数参数类型不同时,就需要用户自己增加对应的重载函数
2、代码的可维护性比较低,其中一个重载函数出错可能所有的重载函数都会出错
- 那能不能实现一个通用的Swap函数呢?实现泛型编程呢?
(泛型编程 -- 编写与类型无关的通用代码,是代码复用的一种手段)
C++中为解决这个问题,有了模板的概念,模板是泛型编程的基础
- 有了模板,相当于告诉编译器一个模子,
让编译器能够根据不同的类型利用该模子来生成对应类型的代码,
模板分为函数模板和类模板图示:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
二 . 函数模板
函数模板的概念
函数模板代表了一个函数家族,该函数模板与类型无关,
在使用时被参数化,根据实参类型产生函数的特定类型版本
函数模板的格式
注意:
typename是用来定义模板参数的关键字(上面的T1、T2、Tn就是模板参数),
除了可以使用typename来定义,还可以使用class来定义//函数模板格式: template<typename T1, typename T2, ……, typename Tn> 函数返回值类型 函数名(参数列表) {// 函数体 }
图示:
函数模板的原理
- 函数模板是一个蓝图,它本身并不是函数,
是编译器使用后能产生特定具体类型函数的摸具。
所以模板就是将本来应该由我们完成的重复的事情交给了编译器完成
- 在编译器编译阶段,对于函数模板的使用,
编译器需要根据传入的实参类型来推演生成对应类型的函数以供调用。
比如:
当使用double类型调用函数模板时,编译器通过对实参类型的推演,
将模板参数T确定为double类型,然后产生一份专门处理double类型的代码图示:
函数模板的实例化
用不同类型的参数调用模板时,称为函数模板的实例化。
模板参数实例化分为:隐式示例化和显式实例化
隐式实例化:
- 让编译器根据实参推演模板参数的实际类型
(上面的图示中的模板参数实例化都是隐式实例化)图示:
- 隐式实例化中:
如果只设置了一个模板参数,但实参中却有多种类型,这时将不能通过编译,
此时有两种处理方式:
1、用户自己来强制转化 ;2、使用显式实例化图示:
---------------------------------------------------------------------------------------------
显式实例化:
- 不通过模板参数推演识别出实参的类型,而是自己显式设置模板参数的类型,
在函数名后的<>中指定模板参数的实际类型即可
- 显式实例化时,如果类型不匹配,编译器会尝试进行隐式类型转换,
如果无法转换成功编译器将会报错
- 显式实例化的真正用法:
设置了一个模板,但函数参数中并没有设置模板参数,
而函数体中却使用了模板参数类型,或者返回值是模板参数类型,
这种情况就需要显式实例化来确定实参类型图示:
模板参数的匹配原则
- 一个非模板函数可以和一个同名的函数模板同时存在,
而且该函数模板还可以被实例化为这个非模板函数图示:
- 对于非模板函数和同名函数模板,如果其它条件都相同,
在调动时会优先调用非模板函数而不会从该模板产生出一个示例。
如果模板可以产生一个具有更好匹配的函数,那么将选择模板图示:
- 模板函数不允许自动类型转换,但普通函数可以进行自动类型转换
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
三 . 类模板
类模板的定义格式
- 类模板定义和函数模板定义类似,定义时将函数的位置换成类即可,
模板参数类型在类中定义成员类型时进行使用//类模板定义格式: template<class T1, class T2, ……, class Tn> class 类模板名 { // 类内成员定义 }
类模板的实例化
- 类模板实例化和函数模板实例化不同,类模板实例化需要在类模板名字后跟<>,
然后将实例化的类型放在<>中即可
- 类模板名字不是真正的类名,显式实例化后的结果才是真正的类名
- 同一个类模板显式实例化出的不同类,这些类的类型是不一样的,
以栈类模板为例:
Stack<int> st1 和 Stack<double> st2
st1 的类型是 Stack<int> ,是用于存储int类型数据的栈;
st2 的类型是 Stack<double> ,是用于存储double类型数据的栈,
st1 和 st2 的类型是不一样的图示 -- 以栈类为例:
- 注意:
类模板成员函数的声明和实现分离不能分离到两个文件中,
分离时通常都写在一个.h文件中。
而且分离后的成员函数实现部分,需要设置对应的函数模板,
分离后不指定成员函数的类域,而是指定其“类模板类型”图示:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
本篇博客相关代码
Test.cpp文件 -- C++文件:
#define _CRT_SECURE_NO_WARNINGS 1//包含IO流: #include <iostream>; //完全展开std命名空间: using namespace std;//Swap函数 -- 交换两个int类型数据: void Swap(int& left, int& right) {int temp = left;left = right;right = temp; }//Swap函数 -- 交换两个double类型数据: void Swap(double& left, double& right) {double temp = left;left = right;right = temp; }//Swap函数 -- 交换两个char类型数据: void Swap(char& left, char& right) {char temp = left;left = right;right = temp; }/* * 这里实现了三个Swap函数, * 分别交换了三种不同的类型, * 但实现的逻辑都是相同的,就只有交换类型不同, * 所以就造成了某种程度的“冗余” * * 上面的函数都需要针对具体的类型, * 那能不能让一个代码能够针对广泛的类型呢, * C++中就有了泛型编程: *///函数模板: template<typename T> //tyename 也可以写成 class //template<class T> //Swap函数 -- 交换两类型数据(泛型编程): void Swap(T& left, T& right) {char temp = left;left = right;right = temp; } /* * 使用函数模板即可实现泛型编程, * 让函数能够针对广泛的类型, * 而不只能针对一种类型, * * 通过关键字template即可定义一个模板, * Swap函数的参数设置为模板参数 *///主函数: int main() {int a = 0; //int类型变量int b = 1; //int类型变量double c = 1.1; //double类型变量double d = 2.2; //double类型变量//调用设置了模板参数的Swap函数:Swap(a, b); //int类型 -- 模板参数TSwap(c, d); //double类型 -- 模板参数T/** 这里调用的两个Swap函数实际不是同一个,* 两个Swap函数的函数地址不同,* 不同类型调用的Swap函数不同是由模板参数导致的* * 模板的原理:* 模板参数接受参数如果是int类型,* 需要调用到int类型的函数,* T 模板参数就会推演成 int类型,(模板参数推演)* 然后就会实例化出具体的函数:* T 是int类型的对应函数。(模板实例化)* * 如果接收的是double类型数据,* T 模板参数就会推演成 double类型,(模板参数推演)* 然后就会示例化出具体的函数:* T 是double类型的对应函数。(模板实例化)*/return 0; }//如果一个函数需要接收不同类型的参数: template<class T1, class T2> /* * 如果需要接收不同类型的参数, * 直接在模板中设置多个模板参数即可, *(模板参数名可以随便取,但一般会取为T -- type) * * 模板参数 和 函数参数 类似, * 但是 函数参数 定义的是 形参对象, * 而 模板参数 定义的则是 类型 */ void func(const T1& t1, const T2& t2) //模板参数T1接收一种类型,T2接收另一种类型 {cout << t1 << endl;cout << t2 << endl;/** 设置了模板参数的函数,* 如果要进行输入或输出,* 就必须使用 cin/cout 进行 输入/输出 了,* 因为设置了模板参数,* 不知道实际传进来的数据是什么数据,* 因为使用 scanf/printf 必须要指定数据类型,* 所以这里使用 scanf/printf 来 输入/输出*/ }//通用(泛型)加法函数: template<class T> T Add(T left, T right) //接收 T 模板参数类型 {return left + right;//返回值也是 T 模板类型 }template<class T> T* f() {//开辟T类型的动态空间:T* p = new T[10];//没设置模板参数T,却使用了T//返回T类型指针:return p;/** 该函数没有设置模板参数T,* (设置的参数不是模板参数)* 但返回值却返回模板指针类型(T*),* * 没设置模板参数就无法进行类型推演*/ }//主函数: int main() {/** 推演实例化:* 函数参数传递,推演出模板参数的类型,* 再生成(实例化)对应的函数*///隐式实例化://T1推演为int,T2推演为int:func(1, 2);//T1推演为double,T2推演为double:func(1.1, 2.2);//T1推演为double,T2推演为int:func(1.1, 2);//调用通用(泛型)加法函数:cout << Add(1, 2.2) << endl;/** 该语句不能通过编译,因为在编译期间,* 当编译器看到该实例化时,需要推演其实参类型* 通过实参a1将T推演为int,通过实参d1将T推演为double类型,* 但模板参数列表中只有一个T,* 编译器无法确定此处到底该将T确定为int 或者 double类型而报错* * 注意:在模板中,编译器一般不会进行类型转换操作,* 因为一旦转化出问题,编译器就需要背黑锅* * 此时有两种处理方式:1. 用户自己来强制转化 2. 使用显式实例化*/ cout << Add(1, (int)2.2) << endl;//显式实例化:// 2.2 隐式转换为int类型:cout << Add<int>(1, 2.2) << endl; // 1 隐式转换为double类型:cout << Add<double>(1, 2.2) << endl;/** 直接显式实例化,指定将参数实例化为某种类型,* 而不通过模板参数的类型推演*///函数没有设置模板参数:double* p = f<double>();/** 函数参数没设置模板参数,* 但却使用了模板参数,* 编译器没法进行类型推演,* 所以此时就需要显式实例化来确定类型* (显式实例化的真正用法)*/return 0; }//使用栈解决多类型问题: typedef int STDataType; /* * 想让栈存储int类型数据, * 就在这里设置类型为int, * 想让栈存储double类型数据, * 就在这里设置类型为double, * …… */类模板: //template<class T> // 类模板 -- 栈类: //class Stack //{ //public: //公有成员函数: // // //构造函数: // Stack(int capacity = 4) // { // //调用了构造函数则打印: // cout << "Stack(int capacity = 4)" << endl; // // //使用new开辟栈容量大小的空间: // // // typedef 设置多类型: // //_a = new STDataType[capacity]; // // // 类模板 设置多类型: // _a = new T[capacity]; //使用模板T类型 // // _top = 0; //栈顶值默认为0 // _capacity = capacity; //设置栈容量 // } // // //析构函数: // ~Stack() // { // //调用了析构函数则打印: // cout << "~Stack()" << endl; // // //使用delete释放new开辟的空间: // delete[] _a; // // _a = nullptr; //置为空指针 // _top = 0; //栈顶值置为0 // _capacity = 0; //栈容量置为0 // } // //private: //私有成员变量: // // T* _a; //栈指针 -- 使用模板T类型 // int _top; //栈顶值 // int _capacity; //栈容量 // //};//类模板: template<class T>//类模板 -- 栈类: class Stack { public: //公有成员函数://构造函数 -- 类模板成员函数声明和定义分离:Stack(int capacity = 4);//析构函数:~Stack(){//调用了析构函数则打印:cout << "~Stack()" << endl;//使用delete释放new开辟的空间:delete[] _a;_a = nullptr; //置为空指针_top = 0; //栈顶值置为0_capacity = 0; //栈容量置为0}private: //私有成员变量:T* _a; //栈指针 -- 使用模板T类型int _top; //栈顶值int _capacity; //栈容量 };//类模板成员函数的声明和实现分离: template<class T> Stack<T>::Stack(int capacity) /* * 实现时指定的不是Stack成员函数的类名(类域), * 而是Stack成员函数的类型, * (不是Stack::,而是Stack<T>) * 需要把模板参数写出来 * * 注: * 类模板不允许声明和定义分离到两个文件, * 分离时都写在一个.h文件中 */ {//调用了构造函数则打印:cout << "Stack(int capacity = 4)" << endl;//使用new开辟栈容量大小的空间:// typedef 设置多类型://_a = new STDataType[capacity];// 类模板 设置多类型:_a = new T[capacity]; //使用模板T类型_top = 0; //栈顶值默认为0_capacity = capacity; //设置栈容量 }//主函数: int main() {/** typedef 可以解决多类型问题,* 那 typedef 可以代替 模板 吗?* * 答案是不能,typedef设置一个类的类型后,* 该类的类型就只能是typedef设置的那一种了,* * 如果用类模板的话设置一个类的话,* 该类的一个对象就可以是int类型,* 而该类的另一个对象还可以是double类型*///显式实例化://让这个栈类型对象存储int类型:Stack<int> st1; //int//让这个栈类型对象存储double类型:Stack<double> st2; //double/** 函数模板可以显式实例化,也可以让它自己推演,* 函数模板大多数情况让它自己推演出类型,* 不进行显式实例化* * 类模板能让一个类的对象是不同类型的,* (如:都是栈类对象,但一个栈对象存储int类型数据,* 另一个栈对象存储double类型数据)* 只需要在创建对象时显式实例化需要的类型即可。* 这时我们实现的数据结构,* 就跟具体的存储类型是无关的,想要哪种类型,* 在创建对象时就显式实例化哪种类型*/return 0; }// 专门处理int的加法函数 -- 非模板函数 int Add(int left, int right) {return left + right; }// 通用加法函数 -- 模板函数 template<class T> T Add(T left, T right) {return left + right; }//测试函数: void Test() {// 与非模板函数匹配,编译器不需要特化:Add(1, 2); // 调用编译器特化的Add版本:Add<int>(1, 2); //函数模板Add被实例化为非模板函数Add }//专门处理int的加法函数 -- 非模板函数 int Add(int left, int right) {return left + right; }//通用加法函数 -- 模板函数 template<class T1, class T2> T1 Add(T1 left, T2 right) {return left + right; }//测试函数: void Test() {//Add(int, int):Add(1, 2);/** 与非函数模板类型完全匹配,* 不需要函数模板实例化*///Add(int, double):Add(1, 2.0);/** 模板函数可以生成更加匹配的版本,* 编译器根据实参生成更加匹配的Add函数*/ }
相关文章:
【C++初阶】八、初识模板(泛型编程、函数模板、类模板)
相关代码gitee自取: C语言学习日记: 加油努力 (gitee.com) 接上期: 【C初阶】七、内存管理 (C/C内存分布、C内存管理方式、operator new / delete 函数、定位new表达式) -CSDN博客 目录 一 . 泛型编程 二 . 函数模板 函数模板…...
珠海数字孪生赋能工业智能制造,助力制造业企业数字化转型
珠海数字孪生赋能工业智能制造,助力制造业企业数字化转型。数字孪生是利用物理模型、传感器更新及运行历史数据,集成多物理量、多尺度的仿真过程。巨蟹数科数字孪生通过构建物理车间与虚拟车间之间的有效映射并实时反馈机制,实现物理车间与虚…...
HarmonyOS开发实战:如何实现一个运动排名榜页面
HarmonyOS开发实战:如何实现一个运动排名榜页面 代码仓库: 运动排名榜页面 项目介绍 本项目使用声明式语法和组件化基础知识,搭建一个可刷新的排行榜页面。在排行榜页面中,使用循环渲染控制语法来实现列表数据渲染,…...
2019年第八届数学建模国际赛小美赛D题安全选举的答案是什么解题全过程文档及程序
2019年第八届数学建模国际赛小美赛 D题 安全选举的答案是什么 原题再现: 随着美国进入一场关键性的选举,在确保投票系统的完整性方面进展甚微。2016年总统大选期间,唐纳德特朗普因被指控受到外国干涉而入主白宫,这一问题再次成为…...
vivado 创建实施约束
创建实施约束 在您有了一个合成的网表之后,您可以将它与XDC文件一起加载到内存中,或者Tcl脚本已启用以进行实现。当加载XDC以便验证和更正任何不能应用的约束。在某些情况下,合成网表中的对象名称与精心设计。如果是这种情况,则必…...
【代码分析】MPI
代码解读 问题 model/AdaMPI.py:21 为什么下降分辨率model.CPN.unet.FeatMaskNetwork 为什么用的是mask,unet? MPI class MPIPredictor(nn.Module):def __init__(self,width384,height256,num_planes64,):super(MPIPredictor, self).__init__()self.…...
数字孪生Web3D智慧机房可视化运维云平台建设方案
前言 进入信息化时代,数字经济发展如火如荼,数据中心作为全行业数智化转型的智慧基座,重要性日益凸显。与此同时,随着东数西算工程落地和新型算力网络体系构建,数据中心建设规模和业务总量不断增长,机房管理…...
飞天使-docker知识点12-docker-compose
文章目录 docker-compose命令启动单个容器重启容器停止和启动容器停止和启动所有容器演示一个简单示范 docker-compose 部署有依赖问题 Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。它允许您使用简单的 YAML 文件来配置应用程序的服务、网络和存储等方…...
快速排序(一)
目录 快速排序(hoare版本) 初级实现 问题改进 中级实现 时空复杂度 高级实现 三数取中 快速排序(hoare版本) 历史背景:快速排序是Hoare于1962年提出的一种基于二叉树思想的交换排序方法 基本思想:…...
GO的sql注入盲注脚本
之间学习了go的语法 这里就开始go的爬虫 与其说是爬虫 其实就是网站的访问如何实现 因为之前想通过go写sql注入盲注脚本 发现不是那么简单 这里开始研究一下 首先是请求网站 这里貌似很简单 package mainimport ("fmt""net/http" )func main() {res, …...
写好ChatGPT提示词原则之:清晰且具体(clear specific)
ChatGPT 的优势在于它允许用户跨越机器学习和深度学习的复杂门槛,直接利用已经训练好的模型。然而,即便是这些先进的大型语言模型也面临着上下文理解和模型固有局限性的挑战。为了最大化这些大型语言模型(LLM)的潜力,关…...
Java实现快速排序及其动图演示
快速排序(Quicksort)是一种基于分治思想的排序算法。它通过选择一个基准元素,将数组分为两个子数组,其中一个子数组的所有元素都小于基准元素,另一个子数组的所有元素都大于基准元素,然后递归地对这两个子数…...
iClient3D 图元操作
1. S3MTilesLayer,S3M(Spatial 3D Model)图层类 S3MTilesLayer,S3M(Spatial 3D Model)图层类,通过该图层实现加载三维切片缓存,包括倾斜摄影模型、BIM模型、点云数据、精细模型、矢量数据、符号等。 那S3MTilesLayer中针对图元的…...
从0到1!开发小白快速入门腾讯云数据库
在这个海量数据大爆发的时代,一个单一的开源数据库产品往往很难直接满足企业的业务需求,在某些场景下,无论是性能、安全还是稳定性,都面临着各种各样的问题。 你在工作中也有这样的烦恼的话,一定是因为你还没有使用过…...
Golang清晰代码指南
发挥易读和易维护软件的好处 - 第一部分 嗨,开发者们,清晰的代码是指编写易于阅读、理解和维护的软件代码。它是遵循一组原则和实践,优先考虑清晰性、简单性和一致性的代码。清晰的代码旨在使代码库更易管理,减少引入错误的可能性…...
C语言 文件I/O(备查)
所有案列 跳转到其他。 文件打开 FILE* fopen(const char *filename, const char *mode); 参数:filename:指定要打开的文件名,需要加上路径(相对、绝对路径)mode:指定文件的打开模式 返回值:成…...
web(HTML之表单练习)
使用HTML实现该界面: 要求如下: 用户名为文本框,名称为 UserName,长度为 15,最大字符数为 20。 密码为密码框,名称为 UserPass,长度为 15,最大字符数为 20。 性别为两个单选按钮&a…...
通过对象轮换实现 LRU 缓存结构
文章目录 通过两个对象轮换,按照是否访问实现内容长久保存rollup 的缓存实现 export default function (max) { //max 缓存容量var num, curr, prev;var limit max || 1;function keep(key, value) {if (num > limit) {prev curr; // 超过容量时当前对象变成缓…...
【Unity动画】综合案例完结-控制角色动作播放+声音配套
这个案例实现的动作并不复杂,主要包含一个 跳跃动作、攻击动作、还有一个包含三个动画状态的动画混合树。然后设置三个参数来控制切换。 状态机结构如下: 完整代码 using System.Collections; using System.Collections.Generic; using UnityEngine;pu…...
【工作流Activiti】任务组
1、Candidate-users候选人 1.1、需求 在流程定义中在任务结点的assignee固定设置任务负责人,在流程定义时将参与者固定设置在.bpmn文件中,如果要临时变更任务负责人则需要修改流程定义,系统扩展性很差,针对这种情况,我…...
桌面概率长按键盘无法连续输入问题
问题描述:概率性长按键盘无法连续输入文本 问题定位: 系统按键流程分析 图一 系统按键流程 按键是由X Server接收的,这一点只要明白了X Window的工作机制就不难理解了。X Server在接收到按键后,会转发到相应程序的窗口中。在窗…...
用23种设计模式打造一个cocos creator的游戏框架----(十九)备忘录模式
1、模式标准 模式名称:备忘录模式 模式分类:行为型 模式意图:在不破坏封装性的前提下捕获一个对象的内部状态,并在对象之外保存这个状态。这样以后就可以将对象恢复到原先保存的状态 结构图: 适用于: …...
动手学深度学习-自然语言处理-预训练
词嵌入模型 将单词映射到实向量的技术称为词嵌入。 为什么独热向量不能表达词之间的相似性? 自监督的word2vec。 word2vec将每个词映射到一个固定长度的向量,这些向量能更好的表达不同词之间的相似性和类比关系。 word2vec分为两类,两类…...
力扣200. 岛屿数量(java DFS解法)
Problem: 200. 岛屿数量 文章目录 题目描述思路解题方法复杂度Code 题目描述 思路 该问题可以归纳为一类遍历二维矩阵的题目,此类中的一部分题目可以利用DFS来解决,具体到本题目: 1.我们首先要针对于二维数组上的每一个点,尝试展…...
解决el-table组件中,分页后数据的勾选、回显问题?
问题描述: 1、记录一个弹窗点击确定按钮后,table列表所有勾选的数据信息2、再次打开弹窗,回显勾选所有保存的数据信息3、遇到的bug:切换分页,其他页面勾选的数据丢失;点击确认只保存当前页的数据࿱…...
web网络安全
web安全 一,xss 跨站脚本攻击(全称Cross Site Scripting,为和CSS(层叠样式表)区分,简称为XSS)是指恶意攻击者在Web页面中插入恶意javascript代码(也可能包含html代码),当用户浏览网页之时&…...
若依 ruoyi-vue3 集成aj-captcha实现滑块、文字点选验证码
目录 0. 前言0.1 说明 1. 后端部分1.1 添加依赖1.2. 修改 application.yml1.3. 新增 CaptchaRedisService 类1.4. 添加必须文件1.5. 移除不需要的类1.6. 修改登录方法1.7. 新增验证码开关获取接口1.8. 允许匿名访问 2. 前端部分(Vue3)2.1. 新增依赖 cryp…...
安卓10 flutter webview 回退会闪退
现象 在安卓10设备上,访问了webview页面后,回退到其他页面后,大概率会闪退,请查看issuses https://github.com/flutter/flutter/issues/78405 解决思路:在回退前,先把webview销毁掉,重新生成一个…...
【Unity入门】物体5种移动方法
目录 一、通过修改位置来实现移动二、通过物理系统实现位移三、通过CharacterController组件四、通过输入控制物体移动 一、通过修改位置来实现移动 利用修改Transform组件的position的两种常用方法。 使用Translate()函数 /*物体将向x方向移动1.5单位…...
Elasticsearch的 8.x常用api汇总
ES的查询语法比较复杂,对于初学者需要在不断练习中才会逐渐掌握,本文汇总了ES各种查询语法以及常用api,可以作为新手的实用笔记 首先,安装 Kibana! 下载Elasticsearch,官方下载页面;Elasticsearch 参考,官方文档;<...
wordpress分类目录在/crm
本文为大家分享了php实现微信分享朋友链接,供大家参考,具体内容如下不是些高深知识,但是第一次做,确实费了很多的时间,终于一点一点的扣了出来,目前已经使用中。解决这个问题,总共碰到了几次BUG…...
中国建设教育协会官网安全员证书/seo咨询师招聘
几乎是默写出来,加上自己理解的博客(iOS面试) 1.函数式编程 函数式编程:主要思想是把运算过程尽量写成一系列嵌套的函数调用,高阶函数;函数是“第一等公民”,像其他数据类型一样,可…...
新华书店的做的数字阅读网站/简述seo和sem的区别
题库来源:安全生产模拟考试一点通公众号小程序 2021年A特种设备相关管理(电梯)考试平台及A特种设备相关管理(电梯)证考试,包含A特种设备相关管理(电梯)考试平台答案和解析及A特种设…...
做网站高流量赚广告费/企业如何进行网络推广
为什么80%的码农都做不了架构师?>>> 在介绍主要内容之前,我们得先了解下DOM提供了一个insertBefore()方法,如方法名,可以把一个新元素插入到一个现有的元素的前面 parentElement.insertBefore(…...
萍乡做网站的/百度退推广费是真的吗
三月份学习android,至今也有半年有余,中间也做过两个项目,但是依然感觉自己做的应用不是很有新意,比不上应用市场上那些应用如此绚丽。所以自己仍需继续努力。学习至今,仍感觉自定义控件是一块硬骨头,还没修…...
甘肃网站制作公司/爱站网能不能挖掘关键词
原文转自:www.cnblogs.com/aicro mysqlpp:: Connect类型主要负责连接事宜,这是在所有开始mysql操作之前必须进行的(这是句废话)。 该类型的主要的结果如下所示 mysqlpp::OpeitonalExceptions 通过查看源码,我看到Optio…...