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

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

一起加油!

目录

一、前言:

二、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.mzph.cn/news/612730.shtml

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

相关文章

Java环境准备:JDK与IDEA

新手小白学Java–环境准备篇 文章目录 新手小白学Java--环境准备篇第1节 JDK的下载与安装第2节 IDEA的下载与安装第3节 使用IDEA创建第一个Java项目第4节 使用小技巧查看电脑的操作系统版本显示出文件的后缀名IDEA 修改字体大小IDEA 修改显示主题色IDEA 修改单行注释的颜色IDEA…

[足式机器人]Part2 Dr. CAN学习笔记-Advanced控制理论 Ch04-4系统的可控性Controllability(LTI)线性时不变

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记-Advanced控制理论 Ch04-4系统的可控性Controllability-LTI线性时不变

软件开发平台应用价值高吗?

我们都知道&#xff0c;随着行业的进步和社会的发展&#xff0c;低代码开发平台也拥有了非常可观的发展前景。利用软件开发平台&#xff0c;可以实现提质增效的办公效率&#xff0c;办公流程化发展也将提上日程。那么&#xff0c;您知道软件开发平台都拥有哪些优势特点吗&#…

ApolloCarla联合仿真基本操作

Apollo 系统架构 CANBus&#xff1a;对接车辆的底盘&#xff0c;做一些数据的收发&#xff0c;如油门&#xff0c;方向盘转角 HDMap&#xff1a; 给localization提供定位图层的信息给perception一些车道线、道路拓扑、红绿灯的信息&#xff08;超时空感知&#xff09;&#x…

geemap学习笔记045:单波段图像梯度计算

前言 求图像的梯度&#xff0c;一般是指在灰度图像或者彩⾊图像上的操作。数字图像是离散的点值谱&#xff0c;也可以叫⼆维离散函数。图像的梯度就是这个⼆维离散函数的求导。下面将详细介绍earth engine中单波段图像的梯度计算。 1 导入库并显示地图 import ee import gee…

医药公司重金请我用Ruby采集国产药品官方数据

爬虫程序是由一系列的代码组成的&#xff0c;通过这些代码&#xff0c;爬虫程序可以从网页中获取信息。今天有个医药公司想要一些药品数据&#xff0c;让我里一共Ruby编写一个爬虫程序&#xff0c;采集一些他们需要的药品数据信息&#xff0c;术业有专攻所以就找我这位大神过去…

MCU FT61F14x入门

目录 前言一、CMIDE的使用二、系统时钟与睡眠2.1 上电复位 (POR)与系统复位2.2 振荡器和系统时钟2.3 SLEEP睡眠模式 (POWER-DOWN)2.4 低电压检测/比较器 (LVD) 三、I/O端口与中断四、串口USART五、定时器六、ADC七、EEPROM 前言 FT61F14x是辉芒微电子的微控制器&#xff0c;是一…

BFC 2024寻龙之旅奇幻启程,龙运市集化身沪上摩登祈福地

2024年1月20日起&#xff0c;BFC外滩金融中心&#xff08;下称BFC&#xff09;“有龙则灵LONGTIME”奇幻秘境重磅登陆外滩&#xff0c;以东方传统文化为载体&#xff0c;打造当代都市传奇新篇。巨型金红神龙空降BFC&#xff0c;以波澜壮阔之势开启新春之旅。外滩枫径龙运市集迎…

uni微信小程序强制用户更新版本

强制更新的代码参考官方文档 uni.getUpdateManager() | uni-app官网 我这边的如下&#xff1a; //检查版本更新const updateManager uni.getUpdateManager();updateManager.onCheckForUpdate(function (res) {// 请求完新版本信息的回调console.log(res.hasUpdate, "是…

【深度学习目标检测】十三、基于深度学习的血细胞识别(python,目标检测,yolov8)

血细胞计数是医学上一种重要的检测手段&#xff0c;用于评估患者的健康状况&#xff0c;诊断疾病&#xff0c;以及监测治疗效果。而目标检测是一种计算机视觉技术&#xff0c;用于在图像中识别和定位特定的目标。在血细胞计数中&#xff0c;目标检测技术可以发挥重要作用。 首先…

2023年全国职业院校技能大赛(高职组)“云计算应用”赛项赛卷⑨

2023年全国职业院校技能大赛&#xff08;高职组&#xff09; “云计算应用”赛项赛卷9 目录 需要竞赛软件包环境以及备赛资源可私信博主&#xff01;&#xff01;&#xff01; 2023年全国职业院校技能大赛&#xff08;高职组&#xff09; “云计算应用”赛项赛卷9 模块一 …

Kubernetes/k8s的存储卷/数据卷

k8s的存储卷/数据卷 容器内的目录和宿主机的目录挂载 容器在系统上的生命周期是短暂的&#xff0c;delete&#xff0c;k8s用控制创建的pod&#xff0c;delete相当于重启&#xff0c;容器的状态也会回复到初始状态 一旦回到初始状态&#xff0c;所有的后天编辑的文件都会消失…

Java零基础教学文档第四篇:HTML_CSS_JavaScript(1)

今日新篇章 【CSS】 【主要内容】 CSS简介 CSS基础语法 CSS选择器 CSS常用属性 CSS元素分类 CSS定位 【学习目标】 1.CSS的简介 1.1 CSS定义与解释** CSS是Cascading Style Sheets&#xff08;层叠样式表单&#xff09;的简称&#xff0c;CSS就是一种叫做样式表&…

2024年了,Layui再战三年有问题不?

v2.9.3 2023-12-31 2023 收官。 form 优化 input 组件圆角时后缀存在方框的问题 #1467 bxjt123优化 select 搜索面板打开逻辑&#xff0c;以适配文字直接粘贴触发搜索的情况 #1498 Sight-wcgtable 修复非常规列设置 field 表头选项时&#xff0c;导出 excel 出现合计行错位的…

Ubuntu系统中指定端口防火墙状态查询与操作

浏览器访问&#xff1a; 如果遇到如山图所示的情况&#xff0c;既有可能是防火墙的问题。具体解决方案参照如下&#xff1a; 1.指定端口的防火墙状态查询 &#xff08;1&#xff09;查询命令 sudo ufw status | grep 8081/tcp #其中8081为要查询的端口号 如果端口是打开的…

TDengine 时序数据库 研究学习以及实战

下载地址&#xff1a;TDengine 发布历史及下载链接 | TDengine 文档 | 涛思数据 下载客户端和服务端 服务端和客户端的安装后 TDengine 客户端连接工具地址&#xff1a;Archive Files | DBeaver Community 添加驱动 新增 》 设置 选择驱动类后 设置里的类名就自动填写了&…

Jetson nano 实时性测试,使用stress-ng 和 cyclictest

系统&#xff1a;ubuntu18.04&#xff0c;Jetpack4.3 打上了实时补丁 安装stress-ng和cyclictest sudo apt-get install stress-ng sudo apt-get install rt-tests 无负载情况的实时性 让两个CPU满载运行60秒 两个CPU满载实时性&#xff1a; 测了一下&#xff0c;4个CPU满载的…

服务端性能测试——性能测试工具JMeter-L1

第一遍没学懂&#xff0c;后续文章会更新~ 目录&#xff1a; 1.JMeter介绍与安装Meter简介JMeter安装2.JMeter的运行JMeter运行、界面功能简介3.使用代理服务器录制请求录制压测脚本&#xff08;一&#xff09;Web端脚本录制方法4.测试计划5.线程组6.控制器7.JMeter采样器/取…

【面试突击】分布式技术面试实战

&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308; 欢迎关注公众号&#xff08;通过文章导读关注&#xff1a;【11来了】&#xff09;&#xff0c;及时收到 AI 前沿项目工具及新技术 的推送 发送 资料 可领取 深入理…

你真的掌握了“C语言分支循环”吗

目录 前言 1. if语句 1.1 if 1.2 else 1.3 分支中包含多条语句 1.4 嵌套if 1.5 悬空else问题 2. 关系操作符 3. 条件操作符 4. 逻辑操作符&#xff1a;&& , || , &#xff01; 4.1 逻辑取反运算符 4.2 与运算符 4.3 或运算符 4.4 练习&#xff1a;闰年的判…