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++实用知识。

相关推荐
luj_17687 小时前
残熵算法实时化三大瓶颈突破
c语言·开发语言·网络·经验分享·算法
不听话坏8 小时前
Ignition篇(下 一) 动态执行前的事情
开发语言·前端·javascript
likeyi078 小时前
require 和 import的区别
开发语言·前端
远离UE48 小时前
UE5 compute shader 原子加
开发语言·c++·ue5
C+-C资深大佬8 小时前
C++ 显式类型转换详解:static_cast、dynamic_cast、const_cast、reinterpret_cast
开发语言·c++
KaMeidebaby9 小时前
卡梅德生物技术快报|抗体亲和力成熟工业化调控新机制:差异性浆细胞增殖工艺优化思路
java·开发语言·人工智能·算法·机器学习·架构·spark
luj_176810 小时前
心形曲线轨迹控制三大关键技术
c语言·开发语言·c++·经验分享·算法
取地址符10 小时前
C++学习笔记(基于learn-cxx)(1)
c++·经验分享·笔记·学习
Mininglamp_271810 小时前
Claude Code 封禁中国开发者之后:本地 AI 编程工具的替代方案实测
开发语言·人工智能·windows·开源软件·ai-native
思麟呀10 小时前
C++17(三)if constexpr+折叠表达式
开发语言·c++