C++模板——(4)C++泛型编程与标准模板库简介

news2024/12/25 15:07:09

归纳编程学习的感悟,
记录奋斗路上的点滴,
希望能帮到一样刻苦的你!
如有不足欢迎指正!
共同学习交流!
🌎欢迎各位→点赞 👍+ 收藏⭐ + 留言​📝
勤奋,机会,乐观是成功的三要素!

一起加油!

目录

一、前言:

二、STL概述: 

三、容器: 

1、向量:

2列表:

3、集合: 

4、双端队列:

5、栈:

6.映射: 

例:使用向量,将字符串传送到字符向量中并显示。 

四、算法:  

五、选代器:

六、共勉: 


一、前言:

        标准模板库(Standard Template Library,STL)是一个高效、实用的 C++程序库。它被容纳于 C++标准程序库中,是ANSI/ISO C++标准中最新的,也是极具革命性的一部分。该库包含了诸多计算机科学领域里常用的基本数据结构和基本算法,为广大 C++程序员们提供了一个可扩展的应用框架,高度体现了软件的可复用性。

二、STL概述: 

        STL在C++程序设计中的作用是提供一个可供函数调用的组件和函数库,当需要时通过接口来调用,STL 的目的是标准化组件,用户不用重新开发它们,就可以使用这些现成的组件。STL
现在是 C++的一部分,被内建在编译器之内。

        虽然STL是一个模板库,但其中也包含了许多部分。一般来说,STL由如下六个部分组成。

(1)容器(Containers):用于管理数据集合,包括各种数据结构,比如vector、list、deque、set、map用来存放数据
        从实现的角度来看,STL容器是一种类模板。
(2)算法(Algorithms):定义了计算过程,其包括各种算法,比如sort、search、copy、erase 等
        从实现的角度来看,STL算法是一种函数模板。
(3)选代器(Iterators):提供了遍历容器的方法它扮演了容器与算法之间的胶合剂、即“泛型指针”。共有5种类型及其他衍生变化。
        从实现角度来讲,STL迭代器是一种将operator*、operator->、operator++、operator--等指针相关操作予以重载的类模板。所有的 STL容器都附有自己专属的迭代器。
(4)仿函数(Functors)将函数封装在对象中,供其他组件使用。行为类似函数,可作为算法的某种策略。

        从实现角度来看,它是一种重载了 operator()的类或者类模板,一般的函数指针可被视为狭义的仿函数。
(5)配接器(Adapters):一种用来修饰容器、仿函数或迭代器的接口,如STL提供的queue和stack,虽然看似容器,其实只能算一种容器配接器,因为它们底部完全借助 deque,所有操作都有底层的 deque 供应。改变functor 接口的被称为function adapter,改变container 接口的被称为container adapter。
(6)配置器(Allocators):负责空间配置与管理。
        从实现角度来看,配置器是一个实现了动态空间配置、空间管理、空间释放的类模板。

        STL的代码从广义上来讲可分为三类:容器(Containers)、算法(AIgorithms)、选代器(Iterators)。几乎所有的代码都采用了模板类和模板函数的方式,这相比于传统的由函数和类成的库来说提供了更好的代码重用机会。

        在C++标准中,STL 被组织为下面的13 个头文件:<algorithms>、<deque>、<functiona>、<iterator>、<vector> 、<list>、<map>、<memory>、<numeric>、<queue>、<set> 、<stack>和<utility> 

三、容器: 

        STL容器允许重复利用已有的实现构造自己特定类型下的数据结构,通过设置一些模板类这些模板的参数允许用户指定容器中元素的数据类型,从而可以提高编程效率。
        容器部分主要由头文件<deque>、<vector>、<list>、<map>、<queue>、<set>、<stack>组成。  

1、向量:

        需在头文件加入:#include<vector>。
        向量是一种 vector 容器类,向量就像是盛放变长数组的容器,大约所有 STL容器中有一般是基于向量的。vector 是一种动态数组,是基本数组的类模板。其内部定义了很多基本操作。vector类中定义了四种构造函数。
(1)默认构造函数:其构造了一个初始长度为0的向量,其调用方式如下        
vector<int>   vl;
(2)带有单个整型参数的构造函数:此参数描述了向量的初始大小,该构造函数还有一个可选的参数,这是一个类型为T的实例,描述了各个向量中各成员的初始值,其调用方式如下:
vector<int>  v2(init_size,0);//如果预先定义了init_size其成员值都初始化为0

(3)复制构造函数构造一个新的向量,作为已存在的向量的完全复制,其调用方式如下
vector<int> v3(v2);

(4)含有两个常量参数的构造函数:产生初始值为一个区间的向量。区间由一个半开区间[first,last]来指定,其调用方式如下:
vector<int> v4(first,last);

        此外,在实际程序中使用较多的还是向量类的成员函数,其常用的成员函数包括:

        begin()、end()、push_back()、insert()、assign()、 front()、 back()、 erase()、 empty()、 at()、 size()。

2列表:

        需在头文件加入:#include<list>
        列表也是容器类的一种,其控制的长度为N的序列是以一个有着N个节点的双向链表来存储的,支持双向迭代器。使用列表的有时是可以在链表中插入和删除的元素或者子链表,只需改变前后指针就可实现。

        列表类的定义如下:

        typedef list<T>,allocator<T>  mycont;        //使用默认模板参数,可以省略第二个参数

其成员函数及作用如下所示
resize:被控序列的长度改为只容纳n个元素,超出元素被删除。
clear:删除所有元素。

front,back:存取被控序列的第一个元素,存取被控序列的最后一个元素。

push_back:向对象末端插人值为x的元素。push_front为对象开始处插入元素;pop_back为删除最后一个元素;pop_front 为删除第一个元素。
assign:为了将被控序列替换成由(first,last)所指定的序列。

insert:为了在迭代器it指定的元u素前插入一个元素。 

erase:删除it所指定的元素。  

splice:将一系列的列表节点接入到一个列表中。

remove:删除所有值等于v的元素。

sort:将序列排序。 

merge:将两个有序排序序列合并。

reverse:翻转整个序列。

3、集合: 

        需在头文件加入:#include<set>
        集合也是容器的一种,它的特点是集合中的元素值是唯一的。在集合中,所有的成员都是排列好的。如果先后往一个集合插入:23、12、0、42、123,则输出该集合时为:0、12、23、42、123。

4、双端队列:

        需在头文件加入:#include<deque>
        双端队列是一个queue容器类(队列容器),与vector类似,支持随机访问和快速插入删除它在容器中某一位置上的操作所花费的线性时间与vector。不同的是,deque 还支持从开始端插入数据,因为其包含在开始端插入数据的函数push_front()。

5、栈:

        需在头文件加入:#include<stack>

        容器栈是一种特殊的容器,其特征是后进先出,即先进来的元素放在栈底,最后才能取出。栈容器支持的操作有如下五种:

  • empty:如果栈为空,返回true; 否则返回false。
  • size:返回栈中元素的个数。
  • pop:删除,但不返回栈顶元素。
  • top:返回,但不删除栈顶元素。
  • push:放人新的栈顶元素。

6.映射: 

        需在头文件加入:#include<map>

        映射用于对数据进行快速和高效的检索。

例:使用向量,将字符串传送到字符向量中并显示。 

#include<vector>			//STL向量头文件 
#include<iostream>
using namespace std;
char *s="Hello world";		//定义字符数组 
int main()
{
	vector<char> vec;		//声明一个字符向量vector 
	vector<char>::iterator vi;//为字符数组定义一个字符游标iterators 
	char *p=s;			 	//定义指针指向字符串 
	while(*p!='\0')			//初识化字符向量,把数据填充到字符向量中 
	{
		vec.push_back(*p);	//puch_back函数,把数据放在向量的尾部 
		p++;
	} 
	for(vi=vec.begin();vi!=vec.end();vi++)
	{
		cout<<*vi;			//将向量中的数据一一显示出来 
	}
	cout<<endl;
	return 0;
}

四、算法:  

         算法是STL的重要组成部分。STL 提供了大约 100个实现算法的模板函数,用户可以通过调用算法模板完成所需的功能,这样大大地提高了用户使用C++进行程序设计的效率。

        一般来说,STL中的算法部分主要由头文件<algorithms>、<numeric>、<functional>组成。其中头文件<algorithms>由模板函数组成,常见的函数涉及比较、交换、查找、排序等。

五、选代器:

        迭代器实际上是一种泛化指针,如果一个迭代器指向了容器中的某一成员,那么迭代器将可以通过自增和自减来遍历容器中的所有成员。迭代器是联系容器和算法的媒介,是算法操作容器的接口。

        简单来说,STL提供的所有算法几乎都是通过迭代器存取元素序列进行工作的,每一个容器都定义了它本身所专有的迭代器,用以存取容器中的元素。在前面运用算法操作容器时,就在不知不觉中使用了迭代器。
        STL中的选代器主要由头文件<utility>、<iterator>、<memory>组成。其中,<utility>包括了贯穿使用在 STL中的几个模板的声明,<iteratot>头文件中提供了迭代器使用的许多方法。<memory>头文件中的主要部分是模板类 allocator,它负责产生所有容器中的默认分配器。

六、共勉: 

        以上就是我对C++模板——(4)C++泛型编程与标准模板库简介的理解,希望本篇文章对你有所帮助,也希望可以支持支持博主,后续博主也会定期更新学习记录,记录学习过程中的点点滴滴。如果有不懂和发现问题的小伙伴,请在评论区说出来哦,同时我还会继续更新对C++模板的理解,请持续关注我哦!!! 

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

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

相关文章

苍穹外卖Day01——解决总结1中存在的问题

前序章节&#xff1a; 苍穹外卖Day01——总结1 解决总结1中存在的问题 1. 什么是JWT2. POJO、Entity、VO、DTO3. Nginx&#xff08;反向代理&#xff09;4. Data注解 1. 什么是JWT JWT&#xff08;JSON Web Token&#xff09;是一种用于在网络应用间传递信息的开放标准&#…

智慧校园电子班牌管理系统源码 Java Android原生

智慧校园电子班牌系统源码是一种智能化的教育管理解决方案&#xff0c;它可以在学校内实现信息共享、教学管理、学生管理、家校互通等各个方面的协调与配合&#xff0c;帮助教师、学生和家长更加高效地开展教学活动、管理学生、协同合作&#xff0c;从而推动学校教育水平的提高…

【高等数学之泰勒公式】

一、从零开始 1.1、泰勒中值定理1 什么是泰勒公式?我们先看看权威解读: 那么我们从古至今到底是如何创造出泰勒公式的呢? 由上图可知&#xff0c;任一无穷小数均可以表示成用一系列数字的求和而得出的结果&#xff0c;我们称之为“无穷算法”。 那么同理我们想对任一曲线来…

Ubuntu启动Xming报错:cannot open display: :1.0

Ubuntu启动Xming报错&#xff1a;cannot open display: :1.0 1、问题描述&#xff1a;2、问题解决&#xff1a;3、实践结果&#xff1a; 叮嘟&#xff01;这里是小啊呜的学习课程资料整理。好记性不如烂笔头&#xff0c;今天也是努力进步的一天。一起加油进阶吧&#xff01; 1、…

Android 事件分发介绍

文章目录 一、目的二、环境三、相关概念3.1 事件分发 四、详细设计4.1应用布局4.1.1 应用布局结构4.1.2 LayoutInspector 4.2 关键View&方法4.2.1 相关View4.2.2 相关方法4.2.3 View与方法关系 4.3 事件分发概念图4.3.1 事件分发类图4.3.2 事件分发模型图 4.4 Activity组件…

C#编程-描述异常

描述异常 异常是在程序执行期间出现的错误。异常情况发生在运算不能正常完成的时候。当程序中出现异常是,系统会抛出错误。错误通过异常处理过程被处理。 例如,System.IO.IOException异常在试图访问非法流对象时抛出。同样,如果分母是0,整数除法运算抛出System.DivideByZ…

02.构建和使用的大型语言模型(LLMs)阶段

我们为什么要建立自己的LLMs?LLM从头开始编码是了解其机制和局限性的绝佳练习。此外,它还为我们提供了必要的知识,可以保留或微调现有的开源LLM架构,以适应我们自己的特定领域的数据集或任务。 研究表明,在建模性能方面,定制(LLMs为特定任务或领域量身定制的)可以胜过…

前端项目构建打包生成Git信息文件

系列文章目录 TypeScript 从入门到进阶专栏 文章目录 系列文章目录前言一、前端项目构建打包生成Git信息文件作用二、步骤1.引入相关的npm包1.1. **fs** 包1.2. **child_process** 包1.3. **os** 包 (非必须 如果你想生成的文件信息中包含当前电脑信息则可用)1.4. **path** 包…

Qt QCheckBox复选按钮控件

文章目录 1 属性和方法1.1 文本1.2 三态1.3 自动排他1.4 信号和槽 2 实例2.1 布局2.2 代码实现 Qt中的复选按钮类是QCheckBox它和单选按钮很相似&#xff0c;单选按钮常用在“多选一”的场景&#xff0c;而复选按钮常用在"多选多"的场景比如喜欢的水果选项中&#xf…

Python从入门到网络爬虫(控制语句详解)

前言 做任何事情都要遵循一定的原则。例如&#xff0c;到图书馆去借书&#xff0c;就需要有借书证&#xff0c;并且借书证不能过期&#xff0c;这两个条件缺一不可。程序设计亦是如此&#xff0c;需要使用流程控制实现与用户的交流&#xff0c;并根据用户需求决定程序“做什么…

特征工程:图像数据不足时的处理办法

在机器学习中&#xff0c;绝大部分模型都需要大量的数据进行训练和学习&#xff08;包括有监督学习和无监督学习&#xff09;&#xff0c;然而在实际应用中经常会遇到训练数据不足的问题。比如图像分类&#xff0c;作为计算机视觉最基本的任务之一&#xff0c;其目标是将每幅图…

Android学习(四):常用布局

Android学习&#xff08;四&#xff09;&#xff1a;常用布局 五种常用布局 线性布局&#xff1a;以水平或垂直方向排列相对布局&#xff1a;通过相对定位排列帧布局&#xff1a;开辟空白区域&#xff0c;帧里的控件(层)叠加表格布局&#xff1a;表格形式排列绝对布局&#x…

Linux的基本指令(5)

目录 bc指令 uname指令 压缩解压相关的指令 zip指令 unzip指令 tar打包压缩指令 tar解压解包指令 ​传输指令sz&rz 热键 关机命令 安装&#xff1a;yum install -y 指令 bc指令 bc命令可以很方便的进行浮点运算 Linux中的计算器 uname指令 语法&#xff1a;unam…

MySQL之导入以及导出远程备份v

目录 一.navact数据导入导出 1.1 导入 1.2 导出 二. mysqldump命令导入导出数据 2.1 导入 2.2 导出 三.load data file进行数据导入导出&#xff08;只限于单表&#xff09; 3.1 导入 3.2 导出 四.远程连接 好啦就到这里了哦!!!希望帮到你哦!!! 一.navact数据导入导…

RIP复习实验

条件: R1为外网&#xff0c;R8和r9的环回分别是172.16.1.0/24和172.16.2.0/24 中间使用78.1.1.0/24 剩下的路由器2-6使用172.16.0.0/16 要求: R1为运营商 r1远程登录r2实际登录r7 R2访问r7要求走r5去访问 全网可达 实现流程: 首先配置好各接口ip address 然后r2-r7使用rip…

Python Matplotlib 库使用基本指南

简介 Matplotlib 是一个广泛使用的 Python 数据可视化库&#xff0c;它可以创建各种类型的图表、图形和可视化效果。无论是简单的折线图还是复杂的热力图&#xff0c;Matplotlib 提供了丰富的功能来满足我们的数据可视化需求。本指南将详细介绍如何安装、基本绘图函数以及常见…

Vue 自定义仿word表单录入之日期输入组件

因项目需要&#xff0c;要实现仿word方式录入数据&#xff0c;要实现鼠标经过时才显示编辑组件&#xff0c;预览及离开后则显示具体的文字。 鼠标经过时显示 正常显示及离开时显示 组件代码 <template ><div class"paper-input flex flex-col border-box "…

2024-01-03 无重叠区间

435. 无重叠区间 思路&#xff1a;和最少数量引爆气球的箭的思路基本都是一致了&#xff01;贪心就是比较左边的值是否大于下一个右边的值 class Solution:def eraseOverlapIntervals(self, points: List[List[int]]) -> int:points.sort(keylambda x: (x[0], x[1]))# 比较…

怎么把epub转换成word文档?

怎么把epub转换成word文档&#xff1f;在看电子书的时候&#xff0c;相信大家都接触过各种电子书格式&#xff0c;比如epub格式&#xff0c;这种格式优点很多&#xff0c;但有个致命的缺点就是编辑能力比较差&#xff0c;这种坏处带来的后果是非常严重的&#xff0c;会让我们无…

OCP NVME SSD规范解读-6.标准日志要求-2

STD-LOG-12:针对日志存储的类型定义了多种&#xff0c;复位&#xff08;包括控制器复位&#xff0c;NSSR、FLR、PCIe hot reset&#xff09;与断电重启POWER CYCLE有不同的操作要求。 STD-LOG-14: Lockdown命令是NVMe管理命令集中的一个命令&#xff0c;主要用于安全和管理目的…