STL 大锅炖(一):什么是 STL
STL 大锅炖(二):String 容器
STL 大锅炖(三):Vector 容器
个人博客内有更多精彩文章欢迎走过路过的大佬们点踩~ 👉 小北北北北的秘密小窝
前言
自编程这一事项诞生以来便伴随着 复用 这个概念的存在,人们总是热衷于寻找一些可重复利用的事物来将高重复性的问题简单化,从函数 (Function),类 (Class),函数库 (Function Library),从面向过程的模块化设计 (POP) 到面向对象程序设计 (OOP),都存在着复用的身影
对于编程而言,复用这个概念必然需要建立于某种 标准 之上,否则即便前人已经完成程序部分通用功能的代码,但由于没有一套相同的标准,导致编程人员必须将该部分已完成的代码重新编写一次,造成了人力资源上的浪费。STL 便应运而生,其拥有着一套数据结构与算法上的标准,同时降低了二者之间的耦合以提升各自的弹性与交互性
一、什么是 STL
标准模板库(英文:Standard Template Library,缩写:STL),是一个 C++ 软件库,可以将 Java 的类库与其相类比,与 Java 的类库相比,C++ 中的标准模板库是通过 模板 (Template) 来实现,其使得 C++ 在有了同 Java 一样强大的类库的同时,保证了更强的可扩展性,但值得注意的一点是为了确保其通用性, STL 并不具有面向对象的特性
,而是通过模板来实现面向过程模式
二、STL 的组成
1. 组件
STL 将 在数据上执行的操作
与 要执行操作的数据
分开,基于这两者的特性,STL 提供了六大组件:
- 容器 (Containers) :在一块空间内存放数据的形式
- 算法 (Algorithm):实现对数据的操作
- 迭代器 (Iterator):容器与算法间的 桥梁,算法通过迭代器操作容器的内容
- 仿函数 (Functors):又称函数对象,行为类似函数,可作为算法的某种策略
- 适配器 (Adapters):用于修饰其他组件,适配成用户指定的形式
- 内存分配器 (Allocators):为容器类模板提供自定义的内存申请和释放功能
用户需要了解的仅为三大主要组件:容器、算法 与 迭代器
2. 组件间的交互
上述六大组件中,后四件为前两件而服务,他们之间的交互关系为:
- 容器 (Container) 通过 内存分配器 (Allocator) 获得内存空间用于存放数据
- 算法 (Algorithm) 通过 迭代器 (Iterator) 操作 容器 (Container) 中的内容
- 仿函数 (Functor) 可以协助 算法 (Algorithm) 完成不同策略变化
- 适配器 (Adapter) 可以修饰或套接 仿函数 (Functor)
三、STL 三大组件
1. 容器
不同的算法在不同数据结构上的表现各有不同,STL 容器封装了诸如:动态数组 (vector),链表 (list),双端队列 (deque),集合 (set),映射 (map) 等较为常见的数据结构
而根据数据在容器内的 排列关系
又将容器分为 序列容器 与 关系容器
- 序列容器:强调值的排序,容器中的每个元素均有固定的位置,除非用删除或插入的操作改变这个位置
- 关系容器:强调值的关系,各元素在容器中并没有保存元素置入容器时的逻辑顺序,采用二叉树结构
从实现的角度来看,STL 容器是一种类模板 (Class Template)
2. 算法
算法,即问题的解法:以有限的步骤,解决逻辑或数学上的问题
STL 所收录的算法包括常用的排序,查找等等,均经过了数学上的效能分析与证明,极具复用价值。特定的算法往往搭配特定的数据结构,算法与数据结构相辅相成。
算法根据有无 修改具体元素内容
而分为 质变算法 与 非质变算法
- 质变算法:运算过程中会更改区间内的元素的内容。例如拷贝,替换,删除等
- 非质变算法:运算过程中不会更改区间内的元素内容,例如查找、计数、遍历等
从实现的角度看,STL 算法是一种 函数模板 (Function Template)
3. 迭代器
迭代器 (Iterator) 是一种抽象的设计概念,其定义如下:提供一种方法,使之能够依序寻访某个容器所含的各个元素,而又无需暴露该容器的内部表示方式。迭代器在广义上是一种 泛化的指针,通过使用迭代器,开发者可以直接对数据结构进行操作而无需关心其内部的实现。
迭代器的设计模式恰好与 STL 的中心思想( 将 操作
与 数据
分离,降低了二者的耦合以提升各自的弹性与交互性 )相符,其使得 容器 (Container) 与 算法 (Algorithms) 可以分别进行独立设计,最后将他们粘合在一起。
而根据迭代器 操作方式
的不同,可以分为五种基本迭代器:
迭代器 | 功能 | 描述 |
---|---|---|
输入迭代器 | 提供对数据的只读访问 | 只读,支持++、==、!= |
输出迭代器 | 提供对数据的只写访问 | 只写,支持++ |
前向迭代器 | 提供读写操作,并能向前推进迭代器 | 读写,支持++、==、!= |
双向迭代器 | 提供读写操作,并能向前和向后操作 | 读写,支持++、–, |
随机访问迭代器 | 提供读写操作,并能随机访问容器的任意数据 | 读写,支持++、–、[n]、-n、<、<=、>、>= |
从实现的角度看,STL 迭代器是一种将 指针操作重载的类模板 (Class Template)
小结
以上便是 STL 的基本概念及其组成部分的详解,也是 STL 大锅炖系列的开篇,在后续将会把 STL 的常见容器及其可能会遇见的各种问题与自身实际经验相结合,各位看官如果看完觉得满意的话不妨留言评论支持一下作者 ~