个人主页:Jason_from_China-CSDN博客
所属栏目:C++系统性学习_Jason_from_China的博客-CSDN博客
所属栏目:C++知识点的补充_Jason_from_China的博客-CSDN博客
前言
string
是标准库中的一个类,它位于<string>
头文件中。这个类提供了很多方便的功能来处理字符串,比如字符串的拼接、查找、替换等操作。
这里作为string的前置讲解,还是比较重要的,需要客观的了解一下,一个是函数的模版,一个是STL
泛型编程
概念概述
核心概念
- 参数化类型
- 泛型编程的核心是使用参数化类型,也称为模板。这些参数可以在编译时被实例化为具体的类型,使得代码可以适应不同的数据类型需求。
- 例如,在 C++ 中,可以定义一个模板函数来实现对不同类型数组的排序:
函数模版应用场景
容器类
- 泛型编程在实现容器类(如数组、链表、栈、队列等)时非常有用。这些容器类可以存储不同类型的元素,并且可以提供通用的操作接口,如插入、删除、遍历等。
- 例如,在 C++ 的标准模板库(STL)中,提供了一系列泛型容器类和算法,如
vector
、list
、map
等,可以方便地处理不同类型的数据。算法
- 泛型编程可以用于实现各种算法,如排序、搜索、遍历等。这些算法可以对不同类型的数据进行操作,只要这些数据满足一定的接口要求。
- 例如,快速排序算法可以用泛型编程实现,对不同类型的数组进行排序。
函数库
- 泛型编程可以用于构建函数库,提供通用的函数和工具,供不同的项目使用。这些函数库可以处理不同类型的数据,提高代码的可重用性和开发效率。
- 例如,一个数学函数库可以使用泛型编程来实现通用的数学函数,如加法、乘法、求平方根等,这些函数可以对不同类型的数值进行操作。
函数模版存在的意义
函数模版
关键字:template
使用:template<typename T>
函数模版使用
#include<iostream> using namespace std; template<typename T> void Swap(T& left, T& right) {T tmp = left;left = right;right = tmp; } int main() {int a = 1; int b = 2;double c = 1.1; double d = 2.2;Swap(a, b);cout << a << "/" << b << endl;Swap(c, d);cout << c << "/" << d << endl;return 0; }
这里我们发现调用成功,但是存在一个问题就是,如果我们希望不同类型直接进行转化,此时是不能实现的,所以我们可以加一个模版
函数模版的不同写法
也就是不仅可以写成template<typename T>
还可以写成template<class T>
函数模版的特殊需要
当存在不只是一个类型的时候,我们需要添加函数模版的类型,这里需要注意,函数模版是支持重载的
#include<iostream> using namespace std; template<typename T> void Swap(T& left, T& right) {T tmp = left;left = right;right = tmp; } template<class T1,class T2> void Swap(T1& left, T2& right) {T1 tmp = left;left = right;right = tmp; } int main() {//相同类型之间进行交换int a = 1; int b = 2;Swap(a, b);cout << a << "/" << b << endl;double c = 1.1; double d = 2.2;Swap(c, d);cout << c << "/" << d << endl;//不相同类型之间进行交换int z = 1; double x = 2.2;Swap(z, x);cout << z << "/" << x << endl;return 0; }
这里是支持函数重载的
函数模版的实例化
简单的说,就是你需要什么类型的,如果你是整形和浮点数类型相加,那么如果你需要整形,那么此时就可以显示实例化
实例讲解
#include<iostream> using namespace std; //函数模版 template<typename T> void Swap(T& left, T& right) {T tmp = left;left = right;right = tmp; } template<class T1,class T2> void Swap(T1& left, T2& right) {T1 tmp = left;left = right;right = tmp; } //写好实现的函数 void Swap(int& left, int& right) {int tmp = left;left = right;right = tmp; } //实例化 template<class T1, class T2> T1 Sum(const T1& left, const T2& right) {return left + right; } //实例化 template<class T> T Sum(const T& left, const T& right) {return left + right; } int main() {//相同类型之间进行交换int a = 1; int b = 2;Swap(a, b);cout << a << "/" << b << endl;double c = 1.1; double d = 2.2;Swap(c, d);cout << c << "/" << d << endl;//不相同类型之间进行交换int z = 1; double x = 2.2;Swap(z, x);cout << z << "/" << x << endl;//实例化int a1 = 1; int b1 = 2;double c1 = 1.1; double d1 = 2.2;cout << Sum(a1, b1) << endl;cout << Sum<int>(c1, d1) << endl;cout << Sum(c1, d1) << endl;return 0; }
模版使用的先后问题
当我们已经写出了swap函数的时候,编译器会优先调用我们写好的函数
这里我们进入vs编译器调试我们是可以发现的,会优先进入写好的函数运行
#include<iostream> using namespace std; //函数模版 template<typename T> void Swap(T& left, T& right) {T tmp = left;left = right;right = tmp; } template<class T1,class T2> void Swap(T1& left, T2& right) {T1 tmp = left;left = right;right = tmp; } //写好实现的函数 void Swap(int& left, int& right) {int tmp = left;left = right;right = tmp; } int main() {//相同类型之间进行交换int a = 1; int b = 2;Swap(a, b);cout << a << "/" << b << endl;double c = 1.1; double d = 2.2;Swap(c, d);cout << c << "/" << d << endl;//不相同类型之间进行交换int z = 1; double x = 2.2;Swap(z, x);cout << z << "/" << x << endl;return 0; }
STL
前言
对于STL的文章,我也是纠结很久,因为真的要好好的写的话,其实就太多了,不如单独列出来,所以我决定和函数模版放在一起进行写,这里做一个简单的介绍,后面我会把 string,vector等等几个,单独列出,大致会分为使用和实现两个方面来完成
STL 介绍
STL(Standard Template Library,标准模板库)是 C++ 标准库的一部分,它提供了一系列通用的、高效的数据结构和算法实现,旨在提高软件开发的效率和质量。
STL 主要由以下几个部分组成:
- 容器(Containers):用于存储和管理数据,如向量(vector)、链表(list)、栈(stack)、队列(queue)等。
- 算法(Algorithms):提供了各种通用的算法,如排序(sort)、查找(find)、遍历(for_each)等,可以对容器中的数据进行操作。
- 迭代器(Iterators):用于遍历容器中的元素,是连接容器和算法的桥梁。
- 仿函数(Functors):也称为函数对象,是可以像函数一样调用的对象,可以作为算法的参数,实现自定义的操作。