首页 > 知识百科 > 正文

【C++】——模板初阶 | STL简介 原创

前言:
模板初阶 | STL简介


文章目录

一、模板初阶1.1函数模板1.2类模板 二、STL简介 (了解)

一、模板初阶

泛式编程(GenericProgramming)是指一种编程范式,其核心思想是编写的可以在不同数据类型上通用的代码,从而提高代码的复用性、可维护性和可扩展性。

泛编程式的实现方式包括模板(Template)和泛编程在C++中,使用模板可以实现泛型编程,而在Java、C#等语言中,则使用泛型来实现类似的功能。


1.1 函数模板

函数模板的格式如下:

template <类型名称 T1,< /span>类型名称 T2,..,类型名称 Tn>返回类型函数名(参数列表) { //函数体}< /pre> 

template :以关键字 template 开始,后跟尖括号 < >,里面是一个或多个模板参数的列表。例如typename T1定义了一个类型模板参数T1,可以替换为其他合法的的标识符。

返回类型:函数的返回类型,可以是任意类型。

函数名:函数的返回类型,可以是任意类型。名称,可以是任意合法的标识符。

参数列表:函数的参数列表,可以包含零个或多个参数,每个参数可以是任意合法的标识符,也可以是模板参数。

函数体:函数的具体实现,包括函数的操作和逻辑。

一个具体的函数模板示例:

//函数模板的定义template <类型名称 T>T 最大值(T x , T y) { 返回 (x > y) ? x : y;}//调用模板函数int 结果1 = 最大值 (10, 20); 结果2 =  最大值(3.14 2.71);

在编译器编译阶段,对于模板函数的使用,编译器需要根据确定的实参类型来推演生成对应类型的函数来供调用。比如:当用double类型使用函数模板时,编译器通过对实参类型的推演,将T确定为double类型,然后产生一个专门处理double类型的代码,对于字符类型也是如此。


< p>函数模板实例化
函数模板的实例化是根据具体的类型,生成模块板函数的过程。当编译器在代码中遇到函数模板的调用时,它会根据传入的参数类型推导出模板参数的具体类型,并生成相应的函数实例。

< code class="a1cf-b7e5-eae9-a675 prism language-cpp">//定义函数模板template <类型名称 T> T 最大值(T x, T y) { 返回 (x > y)  x : y;}int main() { < span class="eac3-4379-c3b9-297b token 关键字">int 结果1 = 最大值(10, 20); //实例化为maximum(10, 20), T 被推导为 int double result2 = 最大值(3.14, 2.71); //实例化为米aximum(3.14, 2.71),T 被推导为 double //或者我们可以手动进行实例化  // 手动实例化模板函数为 int 类型 int result3 = 最大值<int>(10, 20) ; //手动实例化模板函数为 double 类型 double result4 = 最大值<>< /span>(3.14, < span class="297b-2e5b-0109-aa24 token number">2.71); 返回 0;}

函数模板的实例化是在编译时进行的,每次调用函数模板时,都会根据传入的参数类型生成相应的函数实例。这样,同一个函数模板可以用于多种不同类型的参数,实现了通用的函数。


模板参数的匹配原则
一个非模板函数和一个同名的函数模板可以同时存在,编译器会根据一定的匹配规则来确定使用哪一个函数。

如果函数调用的参数列表与非模板函数的参数列表精确匹配,那么就会调用非模板函数。如果函数调用的参数列表可以匹配到函数模板的模板参数类型,并且生成一个能够匹配的实例化函数,那么将调用函数模板的实例化版本。

例如:

<代码类=“棱镜语言-cpp”>//非模板函数void foo (int x) { cout << "函数模板:" << x << endl;}int main(< /span>) { foo(42); //调用非模板函数 foo ("你好"); <温泉n class="a1cf-b7e5-eae9-a675 token comment">//调用函数模板 return 0;}

在这个例子中,调用 foo(42) 时会匹配到非模板函数 foo(int),因为参数类型 int 准确匹配。而调用 foo("hello") 时会匹配到函数模板 foo(T),并实例化为 foo(const char*),因为函数模板的模板参数可以匹配到参数类型 const char*


1.2类模板

除函数模板外,类模板是C++中另一个重要的模板形式,允许定义通用的类,其中的某些成员类型或成员函数可以由用户指定。类模板以 template template 开始,后面跟随类的定义,其中T是一个占位类型符,表示任意类型。

比如我们创建一个类,类的对象的类型可能是int或者char等等:

模板 <  T, int N>class 堆栈 {private: T 元素[N]; int top; // 栈顶索引public: 堆栈() : 顶部(- 1) {} //初始化栈顶索引为-1 void 推送(const T& 元素) { if (top == N - 1) { // 栈满,抛出异常 抛出 std::< span class =“令牌功能”on">overflow_error("Stack<>::push():堆栈溢出"); } 个元素 [++top] = 元素; //将元素入栈 }};

这个示例中,Stack 是一个类模板,有两个模板参数:T 表示元素的类型,N 表示栈的最大容量。

//类模板实例化堆栈<int, 10> intStack; //创建一个最大容量为10个的整型栈Stack< double, 5> doubleStack; //创建一个最大容量为5个的双浮精度点型栈

当类模板中的函数定义放在类外部时,如果函数使用了类模板的模板参数,那么函数定义必须在其前面加上模板参数列表,并且在函数名后面使用类模板的模板参数,以表明该函数是属于类模板的。

例如:

template <类型名称 T> 堆栈 {public: void (const< /span> T& 元素); //函数声明};// 函数定义放置在类外部template <类型名称 T>void < span class="b7e5-eae9-a675-1002 token class-name">堆栈<T>::(const T& 元素) { //函数定义}

二、STL简介 (了解)

STL 是 C++ 标准模板库(Standard Template Library)的缩写。它是 C++ 标准库的一部分,提供了一系列的通用模板类和函数,用于实现各种常见的数据结构和算法,例如向量(vector)、链表(list)、栈(stack)、队列(queue)、集合(set)、映射(map)等,以及对这些数据结构进行操作的算法,如排序、查找、遍历等。

STL的设计思想是基于泛型编程(GenericProgramming),它利用模板技术实现通用性和灵活性,使用户能够在不同的数据类型上使用相同的算法和数据结构。STL提供大量的模板类和函数,使得高效的程序员可以在开发过程中更加地处理各种数据结构和算法问题。

STL(Standard Template Library) )的六大组件:

容器(Containers)
容器是用于存储和管理数据的数据结构,包括向量(vector)、链表(list)、双端队列(deque)、队列(queue)、栈(stack)、集合(set)、映射(map)等。队列容器有不同的特点和适用场景,可以根据具体的需求选择合适的容器。< /p>

算法(Algorithms)
算法是针对容器中的元素进行操作和处理的函数,包括排序、查找、遍历、拷贝、删除等一系列操作。STL提供大量的算法,能够满足各种不同的需求,提高代码的复用性和可用性。

迭代器(Iterators):< br /> 迭代器是一种用于遍历容器中元素的对象,它提供了统一的访问接口,使得算法能够与容器解耦合。STL提供了多种类型的迭代器,包括输入迭代器、输出迭代器器、正向迭代器、多层迭代器和随机访问迭代器,多层迭代器都有不同的功能和特点。

仿函数(Functors)
仿函数是一个可调用对象,它可以像函数一样被调用,并且可以作为算法的参数使用。仿函数可以是普通函数指针、函数对象(重载了函数调用运算符 operator( ) 的类对象)、Lambda 表达式等。STL 提供了一些内置的仿函数,同时也支持用户自定义的仿函数。

适配器(Adapters)
车辆器是一种用于在不同容器之间进行转换和包装的,它可以将一个容器转换为另一个容器,或者在一个容器的基础上提供新的功能。STL提供了一些常用的支架,如栈队列(stack)、队列队列(queue)、优先队列队列(priority_queue)等。

配置器(Allocators)
配置器是一种用途于内存管理的机制,它控制着容器在内存中的分配和释放。STL中的容器和算法都使用了配置器来进行内存管理,但配置器的具体实现通常是由编译器提供的默认配置器。STL也允许用户自定义配置器,满足特定的需求。

这六大组件构成了STL的核心部分,它们共同组成了一个功能强大、高效的仿真的库,为C++程序员提供了丰富的数据结构和算法,极大地提高了程序开发的效率和质量。



如果你喜欢这篇文章,点赞👍 +评论+关注⭐️哦!
欢迎大家提出疑问,以及不同的意见。

【C++】——模板初阶 | STL简介 原创由知识百科栏目发布,感谢您对的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“【C++】——模板初阶 | STL简介 原创