C++模板,STL(Standard Template Library)

这篇文章的主要内容是C++中的函数模板、类模板、STL的介绍。

希望对C++爱好者有所帮助,内容充实且干货,点赞+收藏防止找不到!

再次感谢每个读者和正在学习编程的朋友莅临!

更多优质内容请点击移驾:

C++收录库:重生之C++启程(文章平均质量分93)

目录

1.模板

(1)函数模板

(2)类模板

2.认识STL

(1)什么是STL

(2)STL的六大组件

(3)如何学习STL


1.模板

(1)函数模板

假设一个场景:当我们要写一个swap()函数时候,是不是要这样写

cpp 复制代码
#include<iostream>
using namespace std;
void swap(int& a,int& b)
{
	int tmp = a;
	a = b;
	b = tmp;
}
int main()
{
	int a = 2;
	int b = 3;
	swap(a, b);
	return 0;
}

那当我们同时又想交换两个char类型的变量,是不是得这样写

cpp 复制代码
#include<iostream>
using namespace std;
void swap(int& a,int& b)
{
	int tmp = a;
	a = b;
	b = tmp;
}
void swap(char& c, char& d)
{
	char tmp = c;
	c = d;
	d = tmp;
}
int main()
{
	int a = 2;
	int b = 3;
	swap(a, b);
	char c = 's';
	char d = 'b';
	swap(c, d);
	return 0;
}

这样写构成了函数的重载,使得对应类型与对应的函数相匹配,每次交换时找到合适类型的函数。

虽然函数重载一定程度上解决了不同类型形参调用相同功能函数的需求,但是当每次有新的参数类型需求,又需要程序猿自己写一份重载函数出来。

由于这两个swap()函数的功能完全相同,只是参数类型不同,再写一份属实tm烦。

这时,顺应需求的模板就闪亮登场啦。

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

函数模板格式:template<class T1,class T2...>

函数形参(T1 a,T2 b)

光看这个格式可能有点突兀,下面就用swap函数来感受一下函数模板的魅力

cpp 复制代码
#include<iostream>
using namespace std;
template <class T>//函数模板
void newswap(T& a,T& b)
{
	T tmp = a;
	a = b;
	b = tmp;
}
int main()
{
	int a = 2;
	int b = 3;
	newswap(a, b);
	char c = 's';
	char d = 'b';
	newswap(c, d);
	return 0;
}

运用函数模板,代码明显更加简短,且不同类型形参,newswap函数都能应对自如。

原理: 函数模板是一个蓝图,它本身并不是函数,是编译器用使用方式产生特定具体类型函数的模具。所以其实模板就是将本来应该我们做的重复的事情交给了编译器。

模板实例化: 用模板去产生特定具体类型函数的过程称作模板的实例化。

隐式实例化:让编译器自己推演模板参数的T的类型。例如上图,在swap函数调用时编译器可以通过实参的类型实例化模板参数T,从而产生T类型的函数供我们调用。

但是编译器推演不出来就会报错:

显式实例化:在模板函数调用时程序猿手动控制T的类型。

cpp 复制代码
#include<iostream>
using namespace std;
template <class T>
void newswap(T& a,T& b)
{
	T tmp = a;
	a = b;
	b = tmp;
}
int main()
{
	int a = 2;
	int b = 3;
	newswap<int>(a, b);
	return 0;
}

此时就是模板的显式实例化,程序猿显式实例化后,编译器就不会去推演模板参数T的类型了。

(2)类模板

类模板的大致思路和函数模板相同。

也是一个类只是由于参数的类型不同就得写不同参数类型的类。便将模板特性运用在类上。使得一份类模板可以同时供应不同类型参数的类需求,非常好用。

2.认识STL

(1)什么是STL

对于C++爱好者来说,STL可以说是C++标准库里最常用的工具库。它不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。熟练使用STL以及学习STL底层是必不可少的。

(2)STL的六大组件

(3)如何学习STL

第一境界:熟练使用STL

第二境界:了解STL底层

第三境界:扩充STL

总结:能用,能理,能扩展。


下篇文章开始进入C++中STL的深入学习。

今天的内容就分享到这里啦,如果对大家有所帮助,记得点赞收藏不迷路。订阅下方C++专栏。持续爆肝C++实用知识。

相关推荐
归去来 兮10 分钟前
Python爬虫爬取数据案例
开发语言·爬虫·python
ShineWinsu12 分钟前
对于 C++:C++20中Concept(概念) 与 Coroutine(协程)的解析
linux·开发语言·网络·c++·c++20·epoll
ly768912 分钟前
C 语言从入门到进阶:语法、指针、内存管理与工程实践详解
c语言·开发语言
quantdash_cc29 分钟前
历史数据断层与REST请求慢到崩溃?QuantDash高性能量化数据API终极解决方案
开发语言·python·缓存·php·量化·quantdash
breeze jiang30 分钟前
Next.js 16 App Router 实战:从 About、Blog 动态路由到全局 404
开发语言·javascript·ecmascript
熊野君33 分钟前
Prompt / RAG / 规则 / Skills —— 定位、协作与实现路线
开发语言·python
liulilittle40 分钟前
llmx 学习手册 06 —— CPU 指令集优化(AVX-512 三层演进)
c++·学习·算法·ai·llm
skr爱码士1 小时前
05_Qt 核心模块概览——Qt Core、Gui、Widgets、Quick 的职责划分
c++·qt·系统架构·客户端
山甫aa1 小时前
JavaWeb后端开发学习手册
java·开发语言·数据库·学习·mysql·springboot·web
zlinear数据采集卡1 小时前
数据采集卡从入门到精通(42):项目实战三——设备预测性维护系统,从布点到预警
开发语言·单片机·嵌入式硬件·安全·fpga开发