首页 > 编程语言 >C++--模板

C++--模板

时间:2024-09-13 15:52:21浏览次数:9  
标签:right 函数 temp -- C++ size 模板 left

1 泛型编程

如何将Swap实现乘成一个通用的交换函数

void Swap(int& left, int& right)
{
    int temp = left;
    left = right;
    right = temp;
}

void Swap(double& left, double& right)
{
    double temp = left;
    left = right;
    right = temp;
}

void Swap(char& left, char& right)
{
    char temp = left;
    left = right;
    right = temp;
}

可以看出三个Swap函数相似度极大,而且俩传入参数类型相同,这时候可以利用模板关键字template就能将传入类型抽象出来通用。

template <class T>
void Swap(T& left, T& right)
{
	T temp = left;
	left = right;
	right = temp;
}

将多个类似只是类型不同的函数都可以利用模板将其通用化,类型不同可以表现在传入参数类型不同,返回值类型不同等。

模板分类

1 函数模板

函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。

template <class T>
void Swap(T& left, T& right)
{
	T temp = left;
	left = right;
	right = temp;
}

在编译器编译阶段,对于模板函数的使用,编译器需要根据传入的实参类型来推演生成对应类型的函数以供调用。比如:当用double类型使用函数模板时,编译器通过对实参类型的推演,将T确定为double类型,然后产生一份专门处理double类型的代码,对于字符类型也是如此。简单说就是编译预处理的时候就会将调用的函数模板转换出调用类型的函数代码,意思就是编译器会自动为我们生成所需的调用函数的代码,模板本质上是替换。

函数模板的实例化

用不同类型的参数使用函数模板时,称为函数模板的实例化。

模板参数实例化分为:隐式实例化和显式实例化。

隐式实例化:编译器自动推导T为什么类型

显式实例化:用<>指定T的类型

模板参数匹配

同名的模板函数和非模板函数可以同时存在,而且该模板函数也可以实例化为这个非模板函数。

但调用的时候有所区别。

 3 类模板

类模板定义格式

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

模拟实现vecotor部分功能

#include <iostream>
#include <assert.h>
#include <string>
using namespace std;
template <class T>
class vector
{
public: //不能省 省了就会报错。
	vector()
		:_a(nullptr)
		,_size(0)
		,_capacity(0)
	{

	}
	~vector()
	{
		delete[] _a;
		_a = nullptr;
		_size = 0;
		_capacity = 0;
	}

	size_t size()
	{
		return _size;
	}

	T& operator[](size_t i) //传值返回是临时拷贝,属于常量不可修改,如果需要对返回值进行修改需要传引用
	{
		assert(i < _size);
		return _a[i];
	}


	void Push_Back(const T &x);
	void Pop_Back();
private:
	T* _a;
	size_t _size;
	size_t _capacity;
};
template<class T>
void vector<T>::Push_Back(const T& x)
{
	if (_size == _capacity)
	{
		size_t newcapacity = (_capacity == 0 ? 2 : _capacity * 2);
		T* temp = new T[newcapacity];
		if (_a)
		{
			memcpy(temp, _a, sizeof(T) * _size);
			delete[] _a;
		}
		_a = temp;
		_capacity = newcapacity;
	}
	_a[_size] = x;
	_size++;
}
template <class T>
void vector<T>::Pop_Back()
{
	assert(_size > 0);
	_size--;
}

int main()
{
	vector<int> v;
	v.Push_Back(1);
	v.Push_Back(2);
	v.Push_Back(3);

	for (size_t i = 0; i < v.size(); i++)
	{
		v[i] *= 2;
	}

	for (size_t i = 0; i < v.size(); i++)
	{
		cout << v[i];
	}
	return 0;
}

类模板实例化

类模板实例化与函数模板实例化不同,类模板实例化需要在类模板名字后跟<>,然后将实例化的类型放在<>中即可,类模板名字不是真正的类,而实例化的结果才是真正的类。

// Vector类名,Vector<int>才是类型
Vector<int> s1;
Vector<double> s2;

标签:right,函数,temp,--,C++,size,模板,left
From: https://blog.csdn.net/m0_63703622/article/details/142091828

相关文章

  • 经典前端+后端+表头+表身的开发实战参考简易模板【珍藏】
    前端部分(Vue3+ElementPlus)1.修改MPS002HList.vue(主生产计划列表)a.添加查询表单在模板中添加查询表单,包含产品料号、品名、规格和年月的输入项。<template><div><!--查询表单--><el-form:inline="true":model="filters"class="demo-form-inline&qu......
  • HUAWEI HiCar认证过程中各方需要完成的工作有哪些?
    在深入探讨HUAWEIHiCar认证过程中各方需要完成的工作时,我们首先要对HUAWEIHiCar有一个全面的了解。HUAWEIHiCar是华为提供的人-车-家全场景智慧互联解决方案,它具备安全交互、无感互联、硬件互助以及生态共享等特点,为用户提供无缝流转的优质体验。作为华为的一项重要技术创新,HUAW......
  • 邮政EMS查询|通过python查询快递单号API
    快递聚合查询的优势1、高效整合多种快递信息。2、实时动态更新。3、自动化管理流程。聚合国内外1500家快递公司的物流信息查询服务,使用API接口查询邮政EMS物流的便捷步骤,首先选择专业的数据平台的快递API接口:https://www.tanshuapi.com/market/detail-68以下示例是参考的示例代码:im......
  • P1020 [NOIP1999 提高组] 导弹拦截
    #include<bits/stdc++.h>usingnamespacestd;#defineintlonglongconstintN=1e5+10;intn;inta[N];intq[N];signedmain(){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); intx; while(cin>>x)a[++n]=x; intlen......
  • Tableau-Day3
    课程视频:【Tableau教程】Tableau零基础教程,带你解锁当下最受欢迎的数据可视化软件_哔哩哔哩_bilibili基本表和凸显表基本表:表格形式的数据表达方式凸显表:基本表的基础上,凸显相关数据凸显表制作方式1:先做基本表然后智能显示选择,如下图手工制作:数值拖入颜色标记后,默认改变......
  • 深入解析`make`与`make install`命令,并以Nginx为例说明(Ubuntu系统下)
    引言在软件开发领域,make和makeinstall是两个至关重要的命令,它们分别负责编译源代码和安装编译后的软件。本文将深入剖析这两个命令的工作原理,并以Nginx为例,详细阐述在Ubuntu系统下如何编译和安装Nginx。make命令解析工作原理make命令是一个自动化编译工具,它根据Makefil......
  • 收银员权限-收银系统源码
    收银系统对于门店来说是收银员每天日常高频使用的软件工具,但很多门店老板不想给收银员开放很多权限,如商品改价、订单打折、会员充值、订单退款等都需要门店给其开通权限或者有权限码才能操作。1.收银员交接班收银系统要支持交接班,收银员用自己的账号密码登录收银,下班后可以打印凭......
  • 如何在 macOS 上使用 Hiddify 轻松解决 vpn 连接问题
    **概述:**Hiddify是一款功能强大的工具,旨在简化VPN连接的配置和管理。在macOS系统上,Hiddify提供了一种简便的方法来解决科学上网问题,使得用户能够轻松实现安全的网络访问。以下是使用Hiddify实现vpn连接的详细步骤和说明。**步骤1:下载和安装Hiddify**1.**下......
  • 如何通过OceanBase的多级弹性扩缩容能力应对业务洪峰
    每周四晚上的10点,都有近百万的年轻用户进入泡泡玛特的抽盒机小程序,共同参与到抢抽盲盒新品的活动中。瞬间的并发流量激增对抽盒机小程序的系统构成了巨大的挑战,同时也对其数据库的扩容能力也提出了更高的要求。但泡泡玛特的工程师们一点都不慌。因为基于 OceanBase云数据库......
  • 技术解读 MySQL InnoDB 大对象存储格式
    摘要:本文介绍了InnoDB大对象的存储格式,包括InnoDB会将数据行中的字段按照大对象格式进行存储的场景,InnoDB大对象溢出页存储常见存储格式,并详细介绍了InnoDB对大对象的常见组织管理方式。本文分享自华为云社区《【华为云MySQL技术专栏】InnoDB大对象存储格式解析》,作者:Ga......