当前位置: 首页 > news >正文

C++核心编程——初识STL——STL的基本概念和六大组件

在这里插入图片描述

文章目录💬

    • 一.前言
    • 二.STL基本概念和组成
      • ①容器
      • ②算法
      • ③迭代器
      • ④空间配置器
      • ⑤适配器
      • ⑥仿函数
    • 三.STL工作机制

一.前言

长久以来,软件界一直希望建立一种可重复利用的东西,以及一种得以制造出“可重复运用的东西”的方法,让程序员的心血不止于随时间的迁移,人事异动而烟消云散,从函数(functions),类别(classes),函数库(function libraries),类别库(class libraries)、各种组件,从模块化设计,到面向对象(object oriented ),到模式(pattern)的归纳整理,为的就是复用性的提升。

复用性必须建立在某种标准之上。但是在许多环境下,就连软件开发最基本的数据结构(data structures) 和算法(algorithm)都未能有一套标准。大量程序员被迫从事大量重复的工作,竟然是为了完成前人已经完成而自己手上并未拥有的程序代码,这不仅是人力资源的浪费,也是挫折与痛苦的来源。

为了建立数据结构和算法的一套标准,并且降低他们之间的耦合关系,以提升各自的独立性、弹性、交互操作性(相互合作性,interoperability),诞生了STL。

二.STL基本概念和组成

STL是惠普实验室开发的一系列标准化组件的统称。它是由Alexander Stepanov、M eng Lee和David R.M usser在惠普实验室工作时开发出来的。在1994年,STL被纳入C++标准,成为C++库的重要组成部分。STL主要由六个部分组成:

  • 空间配置器(Allocator)
  • 适配器(Adapters)
  • 容器(Containers)
  • 迭代器(Iterator)
  • 仿函数(Functors)
  • 算法(Algorithm)

STL的一个基本理念就是将数据和操作分离,数据由容器加以管理,操作则由可定制的算法完成,迭代器在两者之间充当“黏合剂”。

STL的组件结构图如下图所示:
在这里插入图片描述

①容器

容器,置物之所也。

容器是存储其他对象的对象,它存储的对象可以是自定义数据类型的对象,也可以是内置数据类型的对象。这些被存储的对象必须是同一种数据类型,它们归容器所有,称为容器的元素。当容器失效时,容器中的元素也会失效。容器本身包含了处理这些数据的方法
从实现角度来看,STL容器是一种class template(类模板)。

STL容器是将运用最广泛的一些数据结构实现出来。数组(array),链表(list),tree(树),栈(stack),队列(queue),集合(set),映射表(map),根据数据在容器中的排列特性,这些数据分为序列式容器和关联式容器两种。

  • 序列式容器就是容器元素在容器中的位置是由元素进入容器的时间和地点来决定。Vector容器、Deque容器、List容器、Stack容器、Queue容器。
  • 关联式容器是指容器已经有了一定的规则,容器元素在容器中的位置由我的规则来决定。Set/multiset容器 Map/multimap容器

STL中的容器共有13种:
在这里插入图片描述

②算法

算法,问题之解法也。

以有限的步骤,解决逻辑或数学上的问题,这一门学科我们叫做算法(Algorithms).
STL收录的算法经过了数学上的效能分析与证明,是极具复用价值的,包括sort、find、copy、for_each等。

从实现角度看,算法是STL定义的一系列函数模板,是STL非常重要的一部分内容。算法可以对容器中的元素施加特定操作。STL算法不依赖于容器的实现细节,只要容器的迭代器符合算法要求,算法就可以通过迭代器处理容器中的元素。

算法分为:质变算法和非质变算法。

  • 质变算法:是指运算过程中会更改区间内的元素的内容。例如拷贝,替换,删除等。
  • 非质变算法:是指运算过程中不会更改区间内的元素内容,例如查找、计数、遍历、寻找极值等等

③迭代器

迭代器是一个广义指针。事实上,它可以是指针,也可以是一个可对其执行类似指针的操作的类模板(共有五种类型,从实现角度来看,迭代器是一种将operator* , operator-> , operator++,operator–等指针相关操作予以重载的class template. )。通过将指针广义化为迭代器,让STL能够为各种不同的容器类(包括那些简单指针无法处理的类)提供统一的接口。所有STL容器都附带有自己专属的迭代器,只有容器的设计者才知道如何借助迭代器使之能够依序寻访某个容器所含的各个元素,而又无需暴露该容器的内部表示方式。该迭代器的类型是一个名为iterator的typedef,其作用域为整个类。

总结:
迭代器是STL提供的用于操作容器中元素的类模板,其行为类似于指针,STL算法利用迭代器遍历容器中的元素,迭代器本身也提供了操作容器元素的方法,使容器元素访问更便捷。迭代器将容器与算法联系起来,起到了“黏合剂”的作用,STL提供的算法几乎都通过迭代器实现元素访问

STL提供了输入迭代器、输出迭代器、正向迭代器、双向迭代器和随机访问迭代器五种类型的迭代器,使用迭代器访问容器元素更简单、易用,且代码更加紧凑、简洁。

种类功能
输入迭代器提供对数据的只读访问只读,支持++、==、!=
输出迭代器提供对数据的只写访问只写,支持++
前向迭代器提供读写操作,并能向前推进迭代器读写,支持++、==、!=
双向迭代器提供读写操作,并能向前和向后操作读写,支持++、- -
随机访问迭代器提供读写操作,并能在数据中随机移动读写,支持++、- -、[n]、-n、<、<=、>、>=

④空间配置器

C++标准库采用了空间配置器实现对象内存空间的分配和归还,空间配置器是特殊的内存模型。例如,使用vector容器,存储数据的空间由空间配置器完成内存的分配和资源回收。空间配置器本质上是对new和delete运算符再次封装而成的类模板,对外提供可用的接口,实现内存资源的自动化管理。

⑤适配器

适配器主要指容器适配器。容器适配器也是一类容器,它除了能存储普通数据,还可以存储list、vector、deque等容器。容器适配器采用特定的数据管理策略,能够使容器在操作数据时表现出另一种行为。例如,使用容器适配器stack封装一个vector容器,使vector容器在处理数据时,表现出栈这种数据结构的特点(先进后出)。
STL提供了三个容器适配器:

  • stack(栈)
  • queue(队列)
  • priority_queue(优先队列)。

适配器体现了STL设计的通用性,极大提高了编程效率。

⑥仿函数

仿函数通过重载函数调用符号()运算符实现,使类具有函数一样的行为。仿函数也称为函数对象,是STL很重要的组成部分,它使STL的应用更加灵活方便,增强了算法的通用性。大多数STL算法可以使用一个仿函数作为参数,以达到某种数据操作的目的。例如,在排序算法中,可以使用仿函数less或greater作为参数,以实现数据从大到小或从小到大的排序。

三.STL工作机制

通过自己书写一个数组容器,来了解算法和容器是怎样分离的,并且了解迭代器是怎样充当粘合剂。

#include <iostream> 
using namespace std;
//数组容器
template<class T>
class MyArray
{
public://保护原生指针,给原生指针取别名,这个别名就是迭代器。typedef T* iterator;//迭代器类型MyArray(){mCapacity = 10;mSize = 10;p = new T[mCapacity];for (int i = 0; i < mCapacity; i++){p[i] = i + 1;}}//提供迭代器,开始位置的迭代器T* begin(){return p;}//返回结束位置的迭代器T* end(){return p + mSize;}
public:T* p;int mCapacity;//数组容量int mSize;//数组当前元素个数
};
//算法
//要遍历整个容器,只需获得容器首尾迭代器即可,这样就把容器和算法分离
//如果没有迭代器,就需要将算法写在容器内,只要用到算法,就要先创建容器,很麻烦。
template<class T>
void printArray(T begin,T end)
{for (; begin != end; ++begin){cout << *begin << " ";}
}
void test()
{MyArray<int> arr;//获取容器提供的开始位置迭代器MyArray<int>::iterator begin=arr.begin();//获取容器提供的结束位置迭代器MyArray<int>::iterator end = arr.end();printArray(begin, end);
}

在这里插入图片描述

相关文章:

C++核心编程——初识STL——STL的基本概念和六大组件

文章目录&#x1f4ac; 一.前言二.STL基本概念和组成①容器②算法③迭代器④空间配置器⑤适配器⑥仿函数 三.STL工作机制 一.前言 长久以来&#xff0c;软件界一直希望建立一种可重复利用的东西&#xff0c;以及一种得以制造出“可重复运用的东西”的方法,让程序员的心血不止于…...

5.2图的BFS与DFS遍历

一.BFS遍历 1.图的广度优先遍历代码实现 说明&#xff1a; 1.广度优先遍历&#xff0c;类比树的层次遍历&#xff08;树属于特殊的图&#xff09; 2.对应算法想象图的物理结构存储&#xff1a; 邻接矩阵表示唯一时间复杂度&#xff1a;O(|V|^2); 邻接表不唯一:O(|V|2|E|)&…...

JSP+SQL网上选课系统(源代码+论文+答辩PPT)

随着科学技术的不断提高,计算机科学日渐成熟,其强大的功能已为人们深刻认识,它已进入人类社会的各个领域并发挥着越来越重要的作用。学生选课系统作为一种现代化的教学技术,以越来越受到人民的重视,是一个学校不可缺少的部分, 学生选课系统就是为了管理好选课信息而设计的。学…...

C语言数据结构——树、堆(堆排序)、TOPK问题

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C&#xff0c;数据结构 &#x1f525;座右铭&#xff1a;“不要等到什么都没…...

springboot+vue 刘老师

课程内容 前端&#xff1a;vue elementui 后端&#xff1a;springboot mybatisplus 公共云部署 ------boot-------- 热部署 不用devtools&#xff0c;交给jrebel工具 RequestMapping ​ 参数 value 路径 method 方法consumes 请求媒体类型 如 application/jsonproduces …...

学生网上考试报名系统的设计与实现

技术栈&#xff1a; MySQL、Maven、SpringBoot、Spring、SpringMVC、MyBatis、HikariCP、fastjson、slf4j系统功能&#xff1a;用户角色&#xff1a; &#xff08;1&#xff09;登录&#xff1a;用户在登录界面输入正确的账户名和密码&#xff0c;点击登录&#xff0c;系统将与…...

Jmeter实现分布式并发

Jmeter实现分布式并发&#xff0c;即使用远程机执行用例。 环境&#xff1a; VMware Fusion Windows系统是win7。 操作过程 1、Master在jmeter.properties添加remote_hosts 2、Slave在jmeter.properties添加server_port 同时把remote_hosts修改为和主机&#xff08;Master…...

动态xml文件配置 hibernate validator 约束校验

父文章 入参校验产品化 schema_个人渣记录仅为自己搜索用的博客-CSDN博客 一般都是通过 注解进行校验, 很少看到 通过配置来进行校验. 自己再通过谷歌找到了官网文档hibernate validator constraint from xml Hibernate Validator 8.0.0.Final - Jakarta Bean Validation Re…...

Vue绑定class样式与style样式

1&#xff0c;回顾HTML的class属性 答&#xff1a;任何一个HTML标签都能够具有class属性&#xff0c;这个属性可能只有一个值&#xff0c;如class"happs"&#xff0c;也有可能存在多个属性值&#xff0c;如class"happs good blue"&#xff0c;js的原生DOM针…...

集权攻击系列:如何利用PAC新特性对抗黄金票据?

黄金票据简介 黄金票据是一种常见的域内权限维持手段&#xff0c;这种攻击主要是利用了Kerberos认证过程中TGT票据由KRBTGT用户的hash加密的特性&#xff0c;在掌握KRBTGT用户密码之后可以通过签发一张高权限用户的TGT票据&#xff0c;再利用这个TGT向KDC获取域内服务的ST来实…...

同程面试(部分)(未完全解析)

一面 Java直接内存有了解吗&#xff1f;为什么Java NIO的效率更高&#xff1f;Netty用到很多NIO&#xff0c;来了一个请求后Netty是怎么分发的&#xff0c;它里面有哪些角色&#xff1f;粘包、拆包怎么解决&#xff1f;为什么建立TCP连接是三次握手&#xff0c;而不是四次&…...

讯飞星火_VS_文心一言

获得讯飞星火认知大模型体验授权&#xff0c;第一时间来测试一下效果&#xff0c;使用申请手机号登录后&#xff0c;需要同意讯飞SparkDesk体验规则&#xff0c;如下图所示&#xff1a; 同意之后就可以进行体验了&#xff0c;界面如下&#xff1a; 讯飞星火效果体验 以下Promp…...

Java的集合

1. HashMap排序题&#xff0c;上机题。 已知一个HashMap<Integer&#xff0c;User>集合&#xff0c; User有name&#xff08;String&#xff09;和age&#xff08;int&#xff09;属性。请写一个方法实现对HashMap 的排序功能&#xff0c;该方法接收 HashMap<Intege…...

addr2line 使用,定位kernel panic 代码位置

在kernel崩溃时&#xff0c;方便定位代码。 需要打开kernel配置CONFIG_DEBUG_INFO。 需要有System.map和vmlinux文件&#xff0c;一般在out目录。 一般panic的时候会有给出panic的指针&#xff0c;如下down_write。 el1_data说明发生异常了&#xff0c;进入和entry.S文件&a…...

OpenAI目前所有模型介绍

目录 概述 GPT-4 (limted beta) GPT-3.5 GPT-3 各类模型介绍 DALLE Beta Whisper Beta Embeddings Moderation Codex (deprecated) 概述 模型描述GPT-4 Limited beta 一组在 GPT-3.5 上改进的模型&#xff0c;可以理解并生成自然语言或代码GPT-3.5一组在 GPT-3 上改…...

【P43】JMeter 吞吐量控制器(Throughput Controller)

文章目录 一、吞吐量控制器&#xff08;Throughput Controller&#xff09;参数说明二、测试计划设计2.1、Total Executions2.2、Percent Executions2.3、Per User 一、吞吐量控制器&#xff08;Throughput Controller&#xff09;参数说明 允许用户控制后代元素的执行的次数。…...

方正书版命令详解

方正书版常用的排版符包括&#xff1a; 空格&#xff1a;表示文字之间的间距&#xff0c;不同字号的文字需要适当调整空格大小。 省略号&#xff1a;用于省略一段文字&#xff0c;通常用三个点表示&#xff08;…&#xff09;。 破折号&#xff1a;用于表示强调或者断句&…...

Gradio的web界面演示与交互机器学习模型,高级接口特征《6》

大多数模型都是黑盒&#xff0c;其内部逻辑对最终用户是隐藏的。为了鼓励透明度&#xff0c;我们通过简单地将Interface类中的interpretation关键字设置为default&#xff0c;使得向模型添加解释变得非常容易。这允许您的用户了解输入的哪些部分负责输出。 1、Interpret解释 …...

本地项目上传到Git(Gitee)仓库

一、步骤解答&#xff08;详细图解步骤见第二大点&#xff09; 1、打开我们的项目所在文件夹&#xff0c;我们发现是不存在.git文件 2、在你的项目文件夹外层【鼠标右击】弹出菜单&#xff0c;在【鼠标右击】弹出的菜单中&#xff0c;点击【Git Bash Here】&#xff0c;弹出运…...

Android 12.0屏蔽掉SystemUI的某些通知提示音

1.概述 在12.0的系统开发中,在系统SystemUI中会发一些通知的声音,但是同时也会在开机的时候,会有一些通知的声音,特别是不想要的一些通知的声音, 这些对于产品还是有一些影响的,所以为了产品体验,就需要屏蔽掉一些开机的通知的声音 2.屏蔽某些通知的提示音的核心代码 …...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

shell脚本--常见案例

1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件&#xff1a; 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&qu…...

多种风格导航菜单 HTML 实现(附源码)

下面我将为您展示 6 种不同风格的导航菜单实现&#xff0c;每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)

前言&#xff1a; 最近在做行为检测相关的模型&#xff0c;用的是时空图卷积网络&#xff08;STGCN&#xff09;&#xff0c;但原有kinetic-400数据集数据质量较低&#xff0c;需要进行细粒度的标注&#xff0c;同时粗略搜了下已有开源工具基本都集中于图像分割这块&#xff0c…...