STL简介与类模板,函数模板的联系,迭代器的引入与初步简单认识

2 篇文章 0 订阅

什么是STL

  1. STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。

STL的版本

  1. 原始版本:Alexander Stepanov、Meng Lee 在惠普实验室完成的原始版本,本着开源精神,他们声明允许任何人任意运用、拷贝、修改、传播、商业使用这些代码,无需付费。唯一的条件就是也需要向原始版本一样做开源使用。 HP 版本–所有STL实现版本的始祖。
  2. P. J. 版本:由P. J. Plauger开发,继承自HP版本,被Windows Visual C++采用,不能公开或修改,缺陷:可读性比较低,符号命名比较怪异。
  3. RW版本:由Rouge Wage公司开发,继承自HP版本,被C+ + Builder 采用,不能公开或修改,可读性一般。
  4. SGI版本:由Silicon Graphics Computer Systems,Inc公司开发,继承自HP版 本。被GCC(Linux)采用,可移植性好,可公开、修改甚至贩卖,从命名风格和编程 风格上看,阅读性非常高。我们后面学习STL要阅读部分源代码,主要参考的就是这个版本。

STL的六大组件与类模板,函数模板

在这里插入图片描述

  1. STL的六大组件当中有一个就是容器,也就是数据结构,这些数据结构都是以类的方式去进行刻画,所以本质上相当于是一个又一个的类。对于很多数据结构而言,需要适配存储各种数据类型。这样势必会延伸出类模板
  2. STL六大组件当中还有一个是算法,这些算法函数都必须得保持它的通用性,因为我在实际代码当中随时随地都需要进行各种各样的调用,以最简单的swap函数为例,为了保证他的使用的通用性,势必会衍生出函数模板在这里插入图片描述

迭代器的引入

  1. 对于STL组件当中的容器,能不能用一种统一的方式访问,遍历与修改容器当中的数据?
  2. 对于STL组件当中的算法,由于这些算法肯定需要去处理容器中的数据,但是我这个算法又需要保持通用性,因此能不能用一种统一的方式去访问,遍历与修改容器当中的数据?并且容器当中的数据大部分都是私有的,想要在算法当中使用操作这些数据,又该怎么破除这个私有限制呢?
  3. 伴随着这些疑问,迭代器出现了…
    在这里插入图片描述

迭代器的简单介绍(不要求深入,大概了解)

  1. 迭代器(Iterator)可以被视为一种新的数据类型,它是C++ STL(标准模板库)中重要的组成部分之一。
  2. 迭代器里面分为很多种,比方说:iterator,const_iterator,reverse_iterator,reverse_const_iterator等等,前两个都是正向迭代器,后两个是反向迭代器
  3. 迭代器用于实现对容器(如数组、列表等)中元素的遍历和访问。通过迭代器,可以像访问普通指针一样访问容器中的元素,但是它提供了更丰富的功能,如随机访问、反向访问等,并且可以与算法(如查找、排序等)配合使用,能够大大简化编写代码的复杂度。因此,迭代器在C++中被广泛应用。
  4. 迭代器(Iterator)和指针(Pointer)非常类似。它们都可以用来遍历和访问内存中的数据,都可以通过解引用操作符(*)访问所指向的数据对象。**此外,迭代器还有自增(++)和自减(–)等运算符,这些运算符在指针中也是有效的。**不过,迭代器和指针也有一些本质的区别。
  5. 目前的话就可以把迭代器理解成像指针一样的东西,但它实际上不一定是指针,有可能是指针,有可能也不是指针。他在用法上面完全模拟了指针,可以进行解引用,++与–等。

迭代器与范围for语法糖

  1. 实际上我们之前讲的那个范围for,其实数组可以用它,容器也可以用它。
  2. 如果你想要通过范围for进行数据的修改的话,注意要加上引用。在这里插入图片描述
  3. 但实际上范围for在底层就是转换为迭代器,它的本质就是迭代器,其实也根本就没有什么范围for,都是替换为为迭代器的
  4. 所以如果说一个类不支持迭代器,那么他肯定也不支持范围for,否则反之。

迭代器实现正向遍历

在这里插入图片描述

迭代器实现反向遍历

在这里插入图片描述

普通迭代器与const迭代器的权限问题

  1. 首先是否被const修饰就决定了两者权限的大小问题。
  2. 这个地球人都知道,如果没有被const修饰,相当于是一个普通的迭代器,那么他可读可写;如果被const修饰,那么此时它的权限就是只读。
  3. 在进行赋值与传参的时候,权限能够平移与缩小,而不能够进行权限的放大

在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

絕知此事要躬行

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值