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

c++征途 --- STL初识

第一部分 --- STL的基本概念

 

 空间配置器就是用来处理 容器的内存空间的开辟和释放的

1.序列式容器:我们按什么顺序将数据存到容器中,数据在容器中就按什么顺序排列

2.关联式容器:数据在容器中的排列顺序和我们存进去时的数据可能不一样 

3.质变算法:算法运算过程中对参与运算的元素进行更改 

4.非质变算法:算法运算过程中不会对参与运算的元素做出任何的改变

 算法要通过与容器对应的迭代器才能够访问容器中的元素(数据)

 能够进行++操作叫做能够前向操作,能够进行--操作叫做能够后向操作 

STL为什么能够诞生? --- 为了提高代码的复用性


第二部分 --- vector存放内置数据类型(int,double啥的)

 

 for_each:遍历算法

iterator:迭代

STL标准模板库中为我们提供了一个标准数组模板使用 --- Vector

 使用标准数组模板的语法:

1.包含这个容器的头文件:

2.创建一个容器 : vector<容器中存放的数据类型> 容器名;

其实这个就和我们自己用类模板实现的数组一样

1.包含写有数组类模板的.hpp文件

2.通过这个类模板实例化一个对象(数组),然后类模板实例化的方式是:

类模板名<赋给类模板参数的类型>   对象名

只不过STL为了避免每一个人都写一遍这个,直接帮我们准备好了一个标准数组类模板

这个数组类模板的模板名是 vector ,然后模板参数列表中只有一个泛型参数

通过这个vector类模板实例化的对象能够实现数组的一系列功能

这个vector类模板又被我们称为vector容器

通过这个vector容器对象(vector类模板对象)调用的这种插入方法是尾插法(在数组中的最后一个元素后买面插入) 

创建一个迭代器对象(指针)的方式:

1.首先我们要声明这个迭代器对象是在那个容器作用域下的:

容器名<赋值给容器的模板参数的类型> ::

2.其次我们要声明我们创建的是一个迭代器对象:在上面的作用域下写一个迭代器关键词 iterator

3.创建一个迭代器对象(指针)来指向容器中的数据(元素):直接上面两步写完的后面加一个我们自定义的迭代器对象名即可 --- 一般都是用 it(迭代器缩写)+ 元素位置来命名

4.给迭代器对象(指针)赋值(赋地址)相当于传给它容器中元素的地址 --- 通过容器自身的方法来获取地址

5.通过解引用迭代器对象我们可以访问到容器中,迭代器对象指向的对应的数据

关于遍历容器中的数据,除了用上面这种自己写的遍历算法之外,我们还可以用STL提供的标准遍历算法,使用方法如下:

1.和使用容器一样,要包含标准算法所属的头文件 --- 

 包含了头文件之后我们就能够使用头文件中包含的各种标准算法了

 for_each就是标准算法头文件中包含的标准遍历算法,我们要传的参数有三个

第一个是我们要遍历的容器中的数据起点,第二个是我们要遍历的容器中的数据终点,第三个是一个函数名,我们会将每一次遍历得到的数据作为参数传给这个函数,并且这个函数每遍历一次就会调用一次


第三部分 ---  vector存放自定义数据类型

通过迭代器对象调用其指向的容器中的自定义类型对象的成员有两种方式:

1.解引用后得到对象本身然后用点操作符访问

2.由于是指针,且获取的是对象的地址,所以可以直接用指针加箭头操作符的方式访问对象的成员

(获取到指向对象的指针之后,我们可以通过指针+箭头操作符的方式访问对象的成员)

(push_back()方法就是vector容器中的尾插法(在容器中的最后一个元素的后面插入一个元素))


第四部分 --- Vector容器嵌套容器

一个Vector容器被我们当成一个数组,在一个容器中嵌套别的容器就相当于在数组中嵌套数组 --- 没错,就是二维数组,我们也可以理解为二维容器。

 上面这行代码翻译过来就是创建一个容器,这个容器中的元素是根据容器的模板参数类型创建的新的容器

 先创建一个大容器,然后大容器的模板参数类型是一个容器类型,通过这个模板参数类型再在大容器中创建一个个小容器+

相关文章:

  • 学习编程的第二十三天
  • 上交所技术——2020春招应用开发工程师(Java)笔试
  • 猿创征文|时间序列分析算法之二次指数平滑法和三次指数平滑法详解+Python代码实现
  • 基于人工兔优化算法的函数寻优和工程优化
  • 网络安全无小事, 所有艾思运维人员, 在nginx中必须对thinkphp的目录做以下安全设置, 未尽目录请自行添加
  • Shiro 权限绕过漏洞(CVE-2020-1957)
  • 【python脚本】用于生成简单握手接口与自测环境的gen_uvm_agent脚本
  • Java多线程下——各类锁的详解
  • vue——VM对象和基础指令
  • 手把手带你刷好题(牛客刷题②)
  • 【web-攻击用户】(9.7.1)本地隐私攻击:持久性cookie、缓存Web内容、浏览历史记录、Flash本地共享对象……
  • Linux shell 内建命令
  • 计算机网络 --- TCP与UDP协议
  • Redis缓存的连环炮面试题
  • 9月17日 杭州站 | Serverless Developer Meetup 开启报名
  • [译] 怎样写一个基础的编译器
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • Angularjs之国际化
  • javascript从右向左截取指定位数字符的3种方法
  • JavaScript设计模式之工厂模式
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • PaddlePaddle-GitHub的正确打开姿势
  • redis学习笔记(三):列表、集合、有序集合
  • Vue 2.3、2.4 知识点小结
  • Vue ES6 Jade Scss Webpack Gulp
  • vue脚手架vue-cli
  • webpack4 一点通
  • 复习Javascript专题(四):js中的深浅拷贝
  • 解析 Webpack中import、require、按需加载的执行过程
  • 前端工程化(Gulp、Webpack)-webpack
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • 《天龙八部3D》Unity技术方案揭秘
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • 直播平台建设千万不要忘记流媒体服务器的存在 ...
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (LeetCode C++)盛最多水的容器
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (附源码)php新闻发布平台 毕业设计 141646
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (十八)三元表达式和列表解析
  • .NET Core 2.1路线图
  • .Net Core/.Net6/.Net8 ,启动配置/Program.cs 配置
  • .NET Core跨平台微服务学习资源
  • .net 程序发生了一个不可捕获的异常
  • .net 无限分类
  • @Import注解详解
  • [2017][note]基于空间交叉相位调制的两个连续波在few layer铋Bi中的全光switch——
  • [Angular 基础] - 表单:响应式表单
  • [C# 基础知识系列]专题十六:Linq介绍
  • [C++] Boost智能指针——boost::scoped_ptr(使用及原理分析)