首页 > 其他分享 >模版初阶(模版)

模版初阶(模版)

时间:2024-11-06 14:46:09浏览次数:4  
标签:初阶 capacity 函数 模版 实例 模板 size

目录

模版堆c++的重要性

泛型编程

函数模版

函数模板的格式:

函数模版的原理:

函数模版的实例化:

模版参数的匹配使用

类模板:

模版的定义和声明:

类模板和函数模板的区别:

补充:

模版堆c++的重要性

其实在函数重载里面可以解决这个问题,但是我们却可以使用c++发明出的模板,这个博班让c++一跃成为世界上面最好的语言之一

泛型编程

泛型编程就是编写与类型无用的通用代码,是代码复用的一种体现,模版是泛型编程的基础

这里面我们主要去学模版函数和类模板

函数模版

模版函数代表了一个函数家族,该函数模板与类型无关,在使用过的时候被参数化,编译器根据实参的类型去推断

函数模板的格式:

template<class T>
T Add(const T& left, const T& right)
{
	return left + right;
}

int Add(const int& x, const int& y)
{
	return (x + y) * 10;
}

int main()
{
	cout << Add(10, 20) << endl;
	return 0;
}

这里面用class或者typename都可以

函数模版的原理:

函数模版是一个蓝图,它本身不是函数,和活体印刷差不多

c++中用swap的库,有多个模版参数就可以使用不用的类型

template<typename T>
void swap(T& a,T& b)
{
T temp = a;
a = b;
b= temp;
}

在编译器的编译阶段,编译器需要根据传入的实参类型来推演生成对应的类型的函数来供调用,当时利用double类型来时用函数模版时候,编辑器通对实参的推演,将T确定为double的类型,然后产生一个专门处理double类型的代码

函数模版的实例化:

这里面的实例化有两种:1.隐式实例化  2 .显示实例化

显示实例化:  可以解决不用类型相加的问题

在c语言里面想要不同类型的转换,我们一般只有强制类型转换

不同类型的参数使用函数模板的时候就是函数模版的实例化

Add(a,(int)d);//推导实例化

Add<int>(a,b);//显示实例化

模版参数的匹配使用

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

隐式类型的转化:主要在整形之间各种的转化,当然浮点数和整形之间都是可以的

特点:

1.对于非模版函数和同名的函数模版,如果其他的条件都是相同的话,在调用的时候会先调用非模版函数而不是先去从该模版里面创建一个实例。但是如果模版可以产生提个具有更好匹配的函数,那么回去选择模版函数

2.模版函数不允许自动类型转换,但是普通函数可以进行自动类型转换

类模板:

if空间如果不够的话,不能调用realloc去扩容,由于realloc的寇蓉不回去调用构造函数去初始化,所以从此以后我们都去手动扩容,这里面扩容有两种,一种是内存够用的话就是蹦迪扩容,如果内存不够的话就是异地扩容。

这里面就是一个例子

#include<iostream>
using namespace std;
template<class T>
class stack
{
public:
	stack(size_t capacity = 4)
	{
		_array = new T[capacity];
		_capacity = capacity;
		_size = size;
	}
	~stack()
	{
		delete[] _array;
		_array = nullptr;
		_capacity = _size = 0;
	}

	//void push(const T& x);
	void push(const X& y)
	{
		if (_capacity == _size)
		{
			X* tmp = new X[_capacity * 2];
			memcpy(tmp, _array, sizeof(X) * size);
			delete[] _array;
			_array = tmp;
			_capacity *= 2;
		}
		_array[_size++] = y;
	}
private:
	T* _array;
	size_t _size;
	size_t  _capacity;
};

模版的定义和声明:

模版不建议定义和声明分离到两个文件.h和.cpp里面,不然会出现连接的错误,具体原因我现在也不知道,后面会将,可以在评论区去at我问一下

如果你想这一千学的typedef就可以了,那可就太小看我们的c++了,如果你想去穿件一盒int和double类型的话,那么就要去拷贝2份了,这样的会很麻烦。

类模板和函数模板的区别:

类模板和函数模板有一些区别,类的模版实例化需要我们再模版名字后面加上<>,然后将实例化的类型放在<>里面,类模板名字不是真正的类,而实例化后的结果才是真正的类

不同类型实例化后产生的类不是用一个类

补充:

只有new出来的才需要delete

set容器

标签:初阶,capacity,函数,模版,实例,模板,size
From: https://blog.csdn.net/gyj215500/article/details/143556515

相关文章

  • 【初阶数据结构篇】链式结构二叉树(续)
    文章目录须知......
  • 数据结构初阶排序全解
    目录1>>排序前言2>>插入排序2.1>>直接插入排序2.2>>希尔排序3>>选择排序3.1>>直接选择排序3.2>>堆排序4>>交换排序4.1冒泡排序4.2快速排序5>>归并排序6>>测试test.csort.hsort.c7>>总结1>>排序前言    排序顾名思义,就是将一组乱序的数,按从大到小......
  • 【初阶数据与算法】线性表之顺序表的定义与实现
    文章目录一、线性表的概念二、顺序表1.概念与结构2.顺序表的分类静态顺序表动态顺序表三、顺序表的实现1.顺序表的结构2.顺序表的初始化和销毁初始化函数销毁函数3.顺序表的扩容4.顺序表的尾插和头插尾插函数头插函数5.顺序表的尾删和头删尾删函数头删函数6.顺序表......
  • 模板初阶及STL简介
    目录一.模板初阶1.泛型函数2.函数模板1.函数模板概念2.函数模板使用格式3.函数模板的原理4.函数模板的实例化5.模板参数的匹配原则3.类模板1.类模板的定义格式2.类模板的实例化二.STL简介1.什么是STL2.STL的版本3.STL的六大组件4.如何学习STL5.STL的缺陷......
  • 大学生个人网页设计 HTML个人网页制作 - html电影介绍电视剧网页模版(8页)
    ......
  • JavaEE初阶---网络原理之TCP篇(二)
    文章目录1.断开连接--四次挥手1.1TCP状态1.2四次挥手的过程1.3time_wait等待1.4三次四次的总结2.前段时间总结3.滑动窗口---传输效率机制3.1原理分析3.2丢包的处理3.3快速重传4.流量控制---接收方安全机制4.1流量控制思路4.2剩余空间大小4.3探测包的机制5.拥塞控制--......
  • 【JavaEE初阶】深入理解TCP协议特性之延时应答,捎带应答,面向字节流以及异常处理
     前言......
  • 模版字符串反引号
    JavaScript的模板字符串(templatestring)是一种字符串字面量,使用反引号(`)来标识。它可以包含动态的部分,即在运行时表达式的值可以嵌入其中。模板字符串中的表达式写在${}内。任何字符串都可以用反引号来创建,而且可以嵌入表达式。letname='Alice';letage=25;letgreeting=......
  • 【办公类-53-14】2024年9月周计划系列优化(5天、6天、7天模版)
    11月为了迎接普及普惠督导抽查,所有班级资料都要做到第11周。我拿出去年的周计划代码,重新批量一下。这学期做代码有一个难点——并非全部5天,“国庆节”的4-5周是7天教案放在一个WORD模版上5天模版(一横三竖=4页)节日写法7天模版(一横四竖=5页)而原版的周计划里面也有6天7......
  • 初阶数据结构之顺序表的实现
    1线性表什么是线性表呢?线性表是n个具有相同特性的数据元素的有限序列。常见的线性表:顺序表,链表,栈,队列,字符串。线性表在逻辑上是线性结构,在物理结构上不一定是线性的。线性表在物理存储时,通常是以数组或链式结构形式存储。线性表大致分为两种:顺序表和链表。基于这两种......