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++模板的理解,请持续关注我哦!!! 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【JaveWeb教程】(26) Mybatis基础操作(新增、修改、查询、删除) 详细代码示例讲解(最全面)

目录 1. Mybatis基础操作1.1 需求1.2 准备1.3 删除1.3.1 功能实现1.3.2 日志输入1.3.3 预编译SQL1.3.3.1 介绍1.3.3.2 SQL注入1.3.3.3 参数占位符 1.4 新增1.4.1 基本新增1.4.2 主键返回 1.5 更新1.6 查询1.6.1 根据ID查询1.6.2 数据封装1.6.3 条件查询1.6.4 参数名说明 1. Myb…

差分算法模板

差分算法模板 一维差分一维insert函数(构造差分数组和实现区域加数操作)一维差分模板题 二维差分二维insert函数(构造差分数组和实现区域加数操作)二维差分模板题 一维差分 差分主要是计算出某个区域段的数分别加上一个数 先给定一个原数组a&#xff1a;a[1], a[2], a[3], a[n]…

【python入门】day28:记录用户登录日志

演示 代码 #-*- coding:utf-8 -*- print(记录用户登录日志----------------------------) import time def show_info():print(输入提示数字,执行相应操作:0退出,1查看登录日志) def write_logininfo(username):#----------记录日志with open(log.txt,a,encodingutf-8)as file…

Tensor Core的一些概念理解

英伟达的GPU产品架构发展如下图&#xff0c;Tensor Core是从2017年的Volta架构开始演变的针对AI模型大量乘加运算的特殊处理单元。本文主要梳理一些关于Tensor Core的一些基础概念知识。 什么是混合精度&#xff1f; 混合精度在底层硬件算子层面&#xff0c;使用半精度&#xf…

阶段十-分布式锁

5.1 节 为什么要使用分布式锁 锁是多线程代码中的概念&#xff0c;只有当多任务访问同一个互斥的共享资源时才需要。如下图&#xff1a; 在我们进行单机应用开发&#xff0c;涉及并发同步的时候&#xff0c;我们往往采用synchronized或者lock的方式来解决多线程间的代码同步问…

【Python】使用pyinstaller打包为Windows平台的xxx.exe方法步骤

pyinstaller 是一个用于将 Python 代码打包成独立可执行文件的工具&#xff0c;它可以将 Python 代码打包成 Windows、Linux、Mac 等平台的可执行文件&#xff0c;方便用户在不同环境中运行。 pyinstaller用法&#xff1a; 1.安装pyinstaller库&#xff0c;这里以PyCharm环境为…

第六站:C++面向对象

面向对象的第一概念:类 类的构成: “类”&#xff0c;是一种特殊的“数据类型”&#xff0c;不是一个具体的数据。 类的设计: 创建一个类: class Human { public://公有的,对外的void eat();//方法,成员函数void sleep();void play();void work();string getName();//获取对内…

AI大模型学习笔记二

文章目录 一、Prompt Engineering1&#xff09;环境准备 二、LangChain&#xff08;一个框架名字&#xff09;三、Fine-tuning&#xff08;微调&#xff09; 一、Prompt Engineering 1&#xff09;环境准备 ①安装OpenAI库 pip install --upgrade openai附加 安装来源 pyth…

Altium Desigenr 孔 规则修改2

1、过孔修改 在这里插入图片描述 2、物理孔

细说JavaScript表达式和运算符号详解

除了简单的表达式还有复杂的表达式&#xff0c;它是由简单表达式构成的&#xff0c;将简单表达式组合成复杂表达式最常见的方法就是使用运算符 一、表达式 表达式分为简单表达式和复杂表达式&#xff0c;但最后的结果均是返回一个值 1、简单表达式 简单表达式又称为原始表达式…

MongoDB - 索引底层原理和使用,聚合的使用(案例 + 演示)

目录 一、MongoDB 索引 1.1、说明 1.2、原理 1.3、操作 1.3.1、创建索引 1.3.2、查看集合索引列表 1.3.3、查看集合索引大小 1.3.4、删除集合所有索引 1.3.5、删除集合指定索引 1.3.6、创建复合索引 1.4、聚合 a&#xff09; 统计每个作者写的文章数 b&#xff09…

没有自动化测试项目经验,3个项目帮你走入软测职场!

学习自动化测试最难的是没有合适的项目练习。测试本身既要讲究科学&#xff0c;又有艺术成分&#xff0c;单单学几个 API 的调用很难应付工作中具体的问题。 你得知道什么场景下需要添加显性等待&#xff0c;什么时候元素定位需要写得更加优雅&#xff0c;为什么需要断言这个元…

如何用MetaGPT帮你写一个贪吃蛇的小游戏项目

如何用MetaGPT帮你写一个贪吃蛇的小游戏项目 MetaGPT是基于大型语言模型(LLMs)的多智能体写作框架&#xff0c;目前在Github开源&#xff0c;其Start数量也是比较高的&#xff0c;是一款非常不错的开源框架。 下面将带你进入MetaGPT的大门&#xff0c;开启MetaGPT的体验之旅。…

机器人行业概况(2)

上篇已经介绍过关于机器人的定义以及分类&#xff0c;下面来看看机器人产业市场规模。 二、国内机器人产业市场规模 中国机器人产业在国家智能制造相关政策的引导下蓬勃发展。在新冠肺炎疫情防控期间&#xff0c;消毒、配送、测温、巡检等各类机器人的“火线上岗”&#xff0…

Electron中 主进程(Main Process)与 渲染进程 (Renderer Process) 通信的方式

1. 渲染进程向主进程通信 修改 html 文件内容 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><!-- 解决控制…

C# 基础入门

第二章 C# 语法基础 2-1 C# 中的关键字 关键字&#xff0c;是一些被C#规定了用途的重要单词。 在Visual Studio的开发环境中&#xff0c;关键字被标识为蓝色&#xff0c;下图代码中&#xff0c;用红方框圈出的单词就是关键字。 关键字 class &#xff0c;这个关键字的用途是…

【GitHub项目推荐--谷歌大神又一开源代码调试神器】【转载】

如果调试是 Debug 的必经之路&#xff0c;那么编程应该将它考虑在内。今天我就和大家分享一个代码调试神器 - Cyberbrain。 Cyberbrain是一个免费开源的 Python 代码调试解决方案&#xff0c;它可视化程序执行以及每个变量的变化方式&#xff0c;让程序员免受调试之苦。主要具有…

【Docker】centos中及自定义镜像,并且上传阿里云仓库可提供使用

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是平顶山大师&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的博客专栏《【Docker】centos中及自定义镜像&#xff0c;…

零零鸡生态养殖农场“出圈”,有“智”更有“质”,助力本土品牌高质量发展

什么是生态农场&#xff1f;不同于常规农场&#xff0c;它对农业生产经营单元的各个关键环节有着极为严格的要求&#xff0c;强调整体、协调、循环、再生、多样&#xff0c;产品质量自然更好&#xff0c;附加值也更高&#xff0c;更能满足日趋多样化的巨大市场。零零鸡生态农场…

机器学习---xgboost算法

1. xgboost算法原理 XGBoost&#xff08;Extreme Gradient Boosting&#xff09;全名叫极端梯度提升树&#xff0c;XGBoost是集成学习方法的王 牌&#xff0c;在Kaggle数据挖掘比赛中&#xff0c;大部分获胜者用了XGBoost。 XGBoost在绝大多数的回归和分类 问题上表现的十分…