模版和STL

个人主页:Jason_from_China-CSDN博客

所属栏目:C++系统性学习_Jason_from_China的博客-CSDN博客

所属栏目:C++知识点的补充_Jason_from_China的博客-CSDN博客

前言

string是标准库中的一个类,它位于<string>头文件中。

这个类提供了很多方便的功能来处理字符串,比如字符串的拼接、查找、替换等操作。

这里作为string的前置讲解,还是比较重要的,需要客观的了解一下,一个是函数的模版,一个是STL

泛型编程

概念概述

核心概念

  1. 参数化类型
    • 泛型编程的核心是使用参数化类型,也称为模板。这些参数可以在编译时被实例化为具体的类型,使得代码可以适应不同的数据类型需求。
    • 例如,在 C++ 中,可以定义一个模板函数来实现对不同类型数组的排序:

函数模版应用场景

  1. 容器类

    • 泛型编程在实现容器类(如数组、链表、栈、队列等)时非常有用。这些容器类可以存储不同类型的元素,并且可以提供通用的操作接口,如插入、删除、遍历等。
    • 例如,在 C++ 的标准模板库(STL)中,提供了一系列泛型容器类和算法,如vectorlistmap等,可以方便地处理不同类型的数据。
  2. 算法

    • 泛型编程可以用于实现各种算法,如排序、搜索、遍历等。这些算法可以对不同类型的数据进行操作,只要这些数据满足一定的接口要求。
    • 例如,快速排序算法可以用泛型编程实现,对不同类型的数组进行排序。
  3. 函数库

    • 泛型编程可以用于构建函数库,提供通用的函数和工具,供不同的项目使用。这些函数库可以处理不同类型的数据,提高代码的可重用性和开发效率。
    • 例如,一个数学函数库可以使用泛型编程来实现通用的数学函数,如加法、乘法、求平方根等,这些函数可以对不同类型的数值进行操作。

函数模版存在的意义

函数模版

关键字: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 主要由以下几个部分组成:

 
  1. 容器(Containers):用于存储和管理数据,如向量(vector)、链表(list)、栈(stack)、队列(queue)等。
  2. 算法(Algorithms):提供了各种通用的算法,如排序(sort)、查找(find)、遍历(for_each)等,可以对容器中的数据进行操作。
  3. 迭代器(Iterators):用于遍历容器中的元素,是连接容器和算法的桥梁。
  4. 仿函数(Functors):也称为函数对象,是可以像函数一样调用的对象,可以作为算法的参数,实现自定义的操作。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python基础:19、Python异常、模块与包

1&#xff09;python异常 什么是异常&#xff1a;异常就是程序运行的过程中出现了错误 bug是什么意思&#xff1a;bug就是指异常的意思&#xff0c;因为历史因为小虫子导致计算机失灵的案例&#xff0c;所以延续至今&#xff0c;bug就代表软件出现错误。 2&#xff09;异常的…

gitlab的基本用法之创建用户和组

安装好gitlab后要做一些基本的创建 创建顺序&#xff1a;先创建组——再创建项目——最后创建用户项目、组、用户的关系&#xff1a;把创建的用户和项目加入组中&#xff0c;只有同一组的用户才能操作该组的项目。 一、创建群组 点击设置就可以看到刚才创建的组 二、创建项…

SpringCloudStream使用StreamBridge实现延时队列

利用RabbitMQ实现消息的延迟队列 一、安装RabbitMQ 1、安装rabbitmq 安装可以看https://blog.csdn.net/qq_38618691/article/details/118223851,进行安装。 2、安装插件 安装完毕后,exchange是不支持延迟类型的,需要手动安装插件,需要和安装的rabbitmq版本一致 https:…

可以在桌面上用的倒计时提醒app下载

在忙碌的工作日常中&#xff0c;我们常常需要记住各种截止日期和重要事件。为了确保这些任务按时完成&#xff0c;一款桌面倒计时提醒应用变得尤为重要。想象一下&#xff0c;当你在电脑桌面上就能清晰地看到剩余时间&#xff0c;这无疑会增加你的工作效率和紧迫感。 敬业签就…

红日安全vulnstack (二)

目录 环境搭建 网卡设置 修改Kali网段 IP 分布 WEB渗透 Weblogin服务开启 漏洞扫描 CVE工具利用 MSF上线 内网渗透 域内信息收集 凭证横向移动 权限维持 黄金票据 参考文章 https://www.cnblogs.com/bktown/p/16904232.htmlhttps://blog.csdn.net/m0_75178803/ar…

好用的python相关的AI工具Bito介绍

插件名称&#xff1a;Bito 好用的python相关的AI工具Bito介绍 step 1:点插件step 2&#xff1a;搜索bito并安装step3 &#xff1a;需要登录&#xff0c;要有真实邮箱&#xff0c;按步骤走就行&#xff0c;完后就可以使用 step 1:点插件 step 2&#xff1a;搜索bito并安装 step3…

关于新国标强制电动车应内置北斗定位模块的规定有哪些?附北斗定位芯片对比参数

关于新国标要求电动自行车内置的北斗定位功能&#xff0c;需要符合以下几点&#xff1a; 支持UART或SPI接口至少支持接收处理北斗B1C和B2a信号具备定位信息的采集、存储和发送功能&#xff08;其中定位信息包括&#xff1a;经度、纬度、速度、定位时间&#xff09;具备采集、存…

1.项目初始化

目录 1.相关联的数据库表 2.使用gorm操作数据库 使用gen生成model和对数据库的操作 3.使用viper进行配置管理 读取配置文件 进行热更新 4.使用Pflag来进行命令行参数解析 5.使用日志slog 日志轮转与切割功能 6.错误码和http返回格式标准化 提供错误码 提供错误类型…

Leetcode—1115. 交替打印 FooBar【中等】(多线程)

2024每日刷题&#xff08;180&#xff09; Leetcode—1115. 交替打印 FooBar C实现代码 class FooBar { private:int n;sem_t fooSem;sem_t barSem;public:FooBar(int n) {this->n n;sem_init(&fooSem, 0, 1);sem_init(&barSem, 0, 0);}~FooBar() {sem_destroy(&…

免杀对抗—内存加载UUID标识IPV4地址MAC地址

前言 试想我们开辟一块内存,然后直接将shellcode写入到对应的内存中并且该内存是可读可写可执行的状态,那么这种方式太容易被AV所查杀,因此当我们如果是利用Windows自身提供的API来将加密或者封装好的shellcode写入到内存执行的话,将会大大增加查杀的难度。 参考文章&#xf…

Linux的pinctrl和gpio子系统

上一章我们编写了基于设备树的 LED 驱动&#xff0c;但是驱动的本质还是没变&#xff0c;都是配置 LED 灯所使用的 GPIO 寄存器&#xff0c;驱动开发方式中硬件初始化这一部分和裸机基本没啥区别。Linux 是一个庞大而完善的系统&#xff0c;尤其是驱动框架&#xff0c;像 GPIO …

Stm32+Esp8266连接阿里云程序移植教程(MQTT协议)

Stm32Esp8266连接阿里云程序移植教程&#xff08;MQTT协议&#xff09; 一、前期准备二、移植过程三、程序的使用3.1 连接上阿里云3.2 传输用户数据到阿里云3.3 解析从阿里云下发给用户的数据3.4 关于调试接口 一、前期准备 自己要的工程文件移植所需的文件&#xff08;如下图&…

新手必看!手把手教你打造10W+爆款文章

自定义 GPTs 的引入彻底改变了博主、营销人员和内容创作者在 ChatGPT 高级版本中的写作方式。这些自定义 GPTs 提供个性化的 AI 工具&#xff0c;旨在执行特定任务&#xff0c;使写作过程更顺畅、迅速且高效。从主题头脑风暴到撰写 SEO 友好的内容&#xff0c;自定义 GPTs 满足…

ES6扩展运算符

1.介绍&#xff1a; ... 扩展运算符能将数组转换为逗号分隔的参数序列&#xff1b; 扩展运算符&#xff08;spread&#xff09;也是三个点&#xff08;...&#xff09;。它好比 rest 参数的逆运算&#xff0c;将一个数组转为用逗号分隔的 参数序列&#xff0c;对数组进…

方波信号发生器(完整SCL源代码)

正弦和余弦信号发生器请参考下面文章链接: 1、博途PLC平台 PLC信号发生器(博途SCL)_博图软件波形发生器怎么用-CSDN博客文章浏览阅读1.1k次。本文介绍了如何使用博途SCL编程实现不同周期和幅值的信号发生器,包括余弦和正弦信号。通过信号发生器,可以用于验证PLC的滤波器效…

Android Framework AMS(06)startActivity分析-3(补充:onPause和onStop相关流程解读)

该系列文章总纲链接&#xff1a;专题总纲目录 Android Framework 总纲 本章关键点总结 & 说明&#xff1a; 说明&#xff1a;本章节主要解读AMS通过startActivity启动Activity的整个流程的补充&#xff0c;更新了startActivity流程分析部分。 一般来说&#xff0c;有Activ…

ZBrush入门使用介绍——17、FiberMesh

大家好&#xff0c;我是阿赵。   继续介绍ZBrush的使用。这次来看看FiberMesh功能。这是一个可以模仿毛发的功能。 一、 使用FiberMesh的预览功能 先准备一个模型&#xff0c;并生成多边形网格 然后按着Ctrl&#xff0c;在模型的表面画一个遮罩。 找到FiberMesh功能&#…

JSP 的 response 和 session 内置对象

文章目录 前言一、response 内置对象 1.重定向网页2.处理 HTTP 文件头3.设置输出缓存二、session 内置对象 1.创建及获取客户会话2.会话中移动指定的绑定对象3.销毁 session 内置对象4.会话超时的管理5. session 对象的应用总结 前言 JSP 的 response 和 session 内置对像&…

HCIP——以太网交换安全(四)DHCP Snooping

目录 一、DHCP Snooping的知识点 二、DHCP Snooping实验拓扑 三、总结 一、DHCP Snooping的知识点 1.1、DHCP snooping 概述&#xff1a; ①DHCP Snooping使能DHCP的一种安全特性&#xff0c;用于保证DHCP客户端从合法的DHCP服务端获取IP地址。DHCP服务器记录DHCP客户端IP…

uniapp 省、市、区、乡镇 数据层级选择插件 Ba-DataPicker

Ba-DataPicker 是一款uniapp数据层级选择弹窗插件。支持省市区乡四级&#xff1b;支持自定义数据。 支持省、市、区、乡镇四级支持自定义数据支持字母检索 截图展示 支持定制、本地包、源码等&#xff0c;有建议和需要&#xff0c;请点击文章结尾“Uniapp插件开发”联系我&am…