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

在这里插入图片描述

前言:
模板初阶 | STL简介


文章目录

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

一、模板初阶

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

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


1.1 函数模板

函数模板的格式如下:

template <typename T1,typename T2,......,typename Tn>
返回类型 函数名(参数列表) {// 函数体
}
  • template <typename T1,typename T2,......,typename Tn>:以关键字 template 开始,后跟尖括号 < >,里面是一个或多个模板参数的列表。例如typename T1 定义了一个类型模板参数 T1,可以替换为其他任意合法的标识符。

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

  • 函数名:函数的名称,可以是任意合法的标识符。

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

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

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

// 函数模板的定义
template <typename T>
T maximum(T x, T y) {return (x > y) ? x : y;
}// 调用模板函数
int result1 = maximum(10, 20);
double result2 = maximum(3.14, 2.71);

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


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

// 定义函数模板
template <typename T>
T maximum(T x, T y) {return (x > y) ? x : y;
}int main() {int result1 = maximum(10, 20); // 实例化为 maximum<int>(10, 20),T 被推导为 intdouble result2 = maximum(3.14, 2.71); // 实例化为 maximum<double>(3.14, 2.71),T 被推导为 double//或者我们可以手动进行实例化// 手动实例化模板函数为 int 类型int result3 = maximum<int>(10, 20);// 手动实例化模板函数为 double 类型double result4 = maximum<double>(3.14, 2.71);return 0;
}

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


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

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

例如:

// 非模板函数
void foo(int x) {cout << "Non-template function: " << x << endl;
}// 函数模板
template <typename T>
void foo(T x) {cout << "Function template: " << x << endl;
}int main() {foo(42); // 调用非模板函数foo("hello"); // 调用函数模板return 0;
}

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


1.2 类模板

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

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

template <class T, int N>
class Stack {
private:T elements[N];int top; // 栈顶索引
public:Stack() : top(-1) {} // 初始化栈顶索引为-1void push(const T& element) {if (top == N - 1) {// 栈满,抛异常throw std::overflow_error("Stack<>::push(): stack overflow");}elements[++top] = element; // 将元素入栈}
};

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

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

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

例如:

template <typename T>
class Stack {
public:void push(const T& element); // 函数声明
};// 函数定义放在类外部
template <typename T>
void Stack<T>::push(const T& element) {// 函数定义
}

二、STL简介 (了解)

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

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

STL(Standard Template Library)的六大组件:
在这里插入图片描述

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

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

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

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

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

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

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


在这里插入图片描述
如果你喜欢这篇文章,点赞👍+评论+关注⭐️哦!
欢迎大家提出疑问,以及不同的见解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2803766.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

C语言中的assert.h:调试助手与断言详解

在C语言编程中&#xff0c;assert.h头文件提供了非常有用的断言&#xff08;Assertion&#xff09;功能&#xff0c;它主要用于开发和调试阶段&#xff0c;确保程序在运行时满足某些预期条件。如果这些条件未得到满足&#xff0c;则程序会立即停止执行&#xff0c;并打印出有关…

架构师技能9-深入mybatis:Creating a new SqlSession到查询语句耗时特别长

开篇语录&#xff1a;以架构师的能力标准去分析每个问题&#xff0c;过后由表及里分析问题的本质&#xff0c;复盘总结经验&#xff0c;并把总结内容记录下来。当你解决各种各样的问题&#xff0c;也就积累了丰富的解决问题的经验&#xff0c;解决问题的能力也将自然得到极大的…

操作系统--调度算法

一、进程调度算法&#xff08;CPU调度算法&#xff09; 什么时候会发生 CPU 调度呢&#xff1f;通常有以下四种情况&#xff1a; 「抢占式调度」&#xff1a;进程正在运行的时&#xff0c;可以被打断&#xff0c;使其把 CPU 让给其他进程。那抢占的原则一般有三种&#xff0c…

测试用例设计方法:招式组合,因果判定出世

1 引言 上篇讲了等价类划分和边界值分析法&#xff0c;而这两种方法只考虑了单个的输入条件&#xff0c;并未考虑输入条件的各种组合、输入条件之间的相互制约关系的场景。基于此短板&#xff0c;因果图法和判定表法应运而生。 2 因果图法 2.1 概念及原理 2.1.1 定义 一种…

BLEU: a Method for Automatic Evaluation of Machine Translation

文章目录 BLEU: a Method for Automatic Evaluation of Machine Translation背景和意义技术原理考虑 n n n - gram中 n 1 n1 n1 的情况考虑 n n n - gram中 n > 1 n\gt 1 n>1 的情况考虑在文本中的评估初步实验评估和结论统一不同 n n n 值下的评估数值考虑句子长度…

一文了解L7812CV的引脚图介绍、参数解读

L7812CV简介 L7812CV是一款具有稳压功能的正向型线性稳压器&#xff0c;能够将输入电压稳定输出为12V的直流电压。它适用于各种需要12V电源的电子设备、电路和系统。 引脚图介绍 L7812CV有三个引脚&#xff0c;分别为输入引脚&#xff08;输入电压Vin&#xff09;、地引脚&…

什么是智慧公厕?智慧公厕跟传统公共厕所的区别

智慧公厕是近年来新兴起的一种公共设施&#xff0c;通过物联网技术的应用&#xff0c;实现了公厕的全面感知、全时监测、全方位精细化管理。与传统的公共厕所相比&#xff0c;智慧公厕在许多方面带来了翻天覆地的变化。本文以智慧公厕源头厂家广州中期科技有限公司&#xff0c;…

【2024.02.22】定时执行专家 V7.0 发布 - TimingExecutor V7.0 Release - 龙年春节重大更新版本

目录 ▉ 新版本 V7.0 下载地址 ▉ V7.0 新功能 ▼2024-02-21 V7.0 - 更新日志▼ ▉ V7.0 新UI设计 ▉ 新版本 V7.0 下载地址 BoomWorks软件的最新版本-CSDN博客文章浏览阅读10w次&#xff0c;点赞9次&#xff0c;收藏41次。▉定时执行专家—毫秒精度、专业级的定时任务执行…

【计算机网络】一些乱七八糟内容

MAC Media Access Control 用于在局域网&#xff08;LAN&#xff09;或广域网&#xff08;WAN&#xff09;中实现设备自动接入网络 "载波侦听多路访问"(Carrier Sense Multiple Access) CSMA/CD 是CSMA的升级版本&#xff0c;加入了序列号检测机制。 CSMA/CA 是CSM…

最优传输(Optimal Transport)

最优传输&#xff08;Optimal Transport&#xff09;是一种数学理论和计算方法&#xff0c;用于描述两个概率分布之间的距离或者对应关系。它的核心概念是如何以最佳方式将一组资源&#xff08;如质量、能量等&#xff09;从一个位置传输到另一个位置。 基本概念&#xff1a; …

金和OA UploadFileBlock接口任意文件上传漏洞

声明 本文仅用于技术交流&#xff0c;请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任 1. 产品简介 金和数字化智能办公平台&#xff08;简称JC6&#xff09;是…

Shopee平台玩具类目选品策略大揭秘

在Shopee平台上经营玩具类目&#xff0c;对于卖家来说&#xff0c;选品是至关重要的一环。只有通过精准的选品策略&#xff0c;才能在激烈的市场竞争中脱颖而出&#xff0c;提高产品的曝光度和销售业绩。以下是一些有效的选品策略&#xff0c;帮助卖家在Shopee平台上成功经营玩…

springboot210基于Springboot开发的精简博客系统的设计与实现

基于Springboot开发的精简博客系统的设计与实现 摘要 当下&#xff0c;正处于信息化的时代&#xff0c;许多行业顺应时代的变化&#xff0c;结合使用计算机技术向数字化、信息化建设迈进。以前企业对于博客信息的管理和控制&#xff0c;采用人工登记的方式保存相关数据&#…

北斗卫星技术引领智能穿戴:未来鞋履的革命

北斗卫星技术引领智能穿戴&#xff1a;未来鞋履的革命 在福建莆田市的苍然社区&#xff0c;70岁以上老人和特殊群体共400多人领到了社区免费发放的北斗定位鞋&#xff0c;该鞋内置北斗导航芯片&#xff0c;具有多种定位、足迹查询、超出范围主动报警等功能。老人穿上这双鞋&am…

[DP学习] 期望DP

一般思路 注&#xff1a;可以用方差求平方的期望 例题一 思路 重点&#xff1a;如何设状态&#xff0c;如何转移。 设状态 f[i] i 张能买到不同卡片的种类数的期望值&#xff08;直接对问题设置状态&#xff09; 状态转移&#xff1a;由于从f[i1]转移到 f[i] 时&#xff0…

Android相机调用-libusbCamera【外接摄像头】【USB摄像头】 【多摄像头预览】

有的自定义系统&#xff0c;对于自己外接的USB摄像头&#xff0c;android原生的camera和camera2都无法打开&#xff0c;CameraX也用不了。这时候就要用libusbCamera&#xff0c;这个库可以打开摄像头&#xff0c;还可以多摄像头同时预览。本文主要是同时打开3个USB摄像头的项目…

LabVIEW多场景微振动测试平台与教学应用

LabVIEW多场景微振动测试平台与教学应用 在多种工程实践中&#xff0c;微振动的测试与分析对于评估结构的稳定性及其对环境的影响至关重要。针对这一需求&#xff0c;开发了一套基于NI-cDAQ和LabVIEW的多场景微振动测试平台&#xff0c;提高微振动测试的精确度与灵活性&#x…

ArcgisForJS如何使用ArcGIS Server发布的切片地图服务?

文章目录 0.引言1.准备海量地理数据2.ArcGIS Server发布切片地图服务3.ArcgisForJS使用ArcGIS Server发布的切片地图服务 0.引言 ArcGIS Server是一个由Esri开发的地理信息系统&#xff08;GIS&#xff09;服务器软件&#xff0c;它提供了许多功能&#xff0c;包括发布切片地图…

Kotlin 进阶 学习 委托

1.接口委托 package com.jmj.jetpackcomposecompositionlocal.byStudy/*** 接口委托*/ interface HomeDao{fun getAllData():List<String> }interface ADao{fun getById(id:Int):String }class HomeDaoImpl:HomeDao{override fun getAllData(): List<String> {ret…

嵌入式学习笔记总结Day23----minshell项目总结

今天进行了linux系统高级编程io阶段学习的结尾&#xff0c;完成了一个minshell的小项目。 一、项目介绍 利用Linux中IO接口实现MiniShell&#xff0c;实现常用的shell指令的实现。 项目想要实现需要思考的地方有&#xff1a; 1.如何打印终端命令 2.如何接受终端命令 3.实现对…