C++STL_01_STL基础和概述
STL基础和概述
STL(standard template library):本质是一种标准模板库(泛型库),是为节省代码量封装起来的通用库。
只是STL里面几乎全部都是基础模板函数和模板类,属于C++,不需要额外安装
STL 最初由惠普实验室开发,
于 1998 年被定为国际标准,正式成为 C++ 程序库的重要组成部分。
如今 STL 已完全被内置到支持 C++ 的编译器中,无需额外安装,致使STL 被广泛使用。
STL 位于C++ 的头文件中,以源代码的形式提供。
STL最大的作用就是:STL 基本上达到了各种存储方法和相关算法的高度优化。
基本考虑到了众多代码细节实现的方法,便于宏观编写代码
广义上STL:容器、算法、迭代器。
STL六大组件:容器、算法、迭代器、仿函数(函数对象)、适配器、空间适配器(内存分配器)
容器:就是专门用来存放数据的,封装了一些数据结构模板类;(数组、链表、队列、栈等等)
(vector 向量容器(可变长度数组)、list 列表容器(链表) deque双端队列容器等 )
算法(algorithm):对容器中的数据进行处理和操作,封装了一些数据结构算法设计成模板函数;
质变算法:对容器中原本的数据有影响。(拷贝、增删改)
非质变算法:对容器中原本的数据没有影响。(遍历、查找)
在 std 命名空间定义,大部分在<algorithm> 中,少部分在 <numeric> 中。
迭代器:完成对容器中数据的读写操作,作为容器(数据)和算法(方法)之间的粘合剂。称为泛型指针
仿函数:行为类似函数,是一种重载了operator()的class,一般的函数指针可以视为狭义的仿函数
适配器:使一个类的接口(模板的参数)适配成用户指定的形式,让原本不能一起的两个类一起工作。
(容器、迭代器、算法都有适配器)
内存分配器:为容器类模板提供自定义内存申请和释放功能,负责空间适配和管理
(高级用户才有需求,一般用户不怎么使用的到)
C++ STL头文件
<iterator> | <memory> | <vector> | <stack> | <list> | <queue> | <set> |
<functional> | <algorithm> | <deque> | <utility> | <map> | <numeric> |
按照 C++ 标准库的规定,所有标准头文件都不再有扩展名。即标准头文件不使用".h"
但是为了向下兼容,某些STL版本同时存储具备扩展名和无扩展名的两种文件
甚至某些文件可能会有三种文件!
容器
容器:就是一些模板类的集合,容器中封装的模板类描述的是组织数据(数据结构)
容器主要分两大类:1、序列式容器;(序列容器)
2、关联式容器;(排序容器、哈希容器)
序列容器:元素排列按位置顺序排列,与元素值大小无关
(vector向量容器、list列表容器、deque双端队列容器)
关联容器:元素排列按元素大小(默认从小到大)或者哈希函数序列排列,与位置顺序无关
(set集合容器、multiset多重集合容器、map映射容器、multimap多重映射容器)
(unordered_set哈希集合、unordered_multiset哈希多重集合)
(unordered_map 哈希映射、 unordered_multimap 哈希多重映射)
算法
算法:就是问题的解法,以有限的步骤解决问题的方法
其实我们写的代码、函数、类都可以称作算法,只不过这些“算法”不具备复用性;
只有那些经过反复验证和推理的通用性解决问题的方法,才被人们真正广为流传称为算法!
包括查找、排序、增删改查等!
迭代器
迭代器:就是调节和匹配容器和算法之间的润滑剂。
(对外隐藏容器内部数据的差异,提供给算法统一的接口;对内具体执行数据的读写操作)
1、不同容器意味着数据结构不同,自然操作数据的迭代器也会不同;
2、容器对应的迭代器功能强弱直接决定对STL中的算法支持程度;
3、迭代器和C++指针非常相似,可以完成常规指针的所有操作,可以具体指向容器内某个元素;
4、迭代器是一个变量,*迭代器名就表示迭代器指向的元素。
常用的迭代器按功能强弱主要分为:
①输入迭代器;②输出迭代器;③前向迭代器;④双向迭代器;⑤随机访问迭代器。
输入迭代器:迭代器指向某个输入流,可以用输入迭代器进行程序的输入;
istream_iterator<int,char>第一参数指出要读取的数据类型,第二参数指出输入流要使用的数据类型
输出迭代器:迭代器指向某个输出流,可以用输出迭代器进行程序的输出;
ostream_iterator<int,char>第一参数指出送到输出流的数据类型,第二参数表示输出流的数据类型
前向迭代器:支持++p、p++、*p等正向移动(从前往后),两个正向迭代器可相互赋值和比较;
双向迭代器:支持++平、--p、p++、p--、*p正反双向的移动(前向迭代器、反向迭代器);
随机访问迭代器:具备双向迭代器的全部功能,并且p是一个随机访问迭代量。
例子:vector<int> v; //定义一个vector容器对象v,v存放的是一个可变长度的数组;
vector<int>::iterator i; //定义正向迭代器i
vector<int>::reverse_iterator j; //定义反向向迭代器j
仿函数
仿函数也叫函数对象!仿函数是早期的叫法,现在也称作为函数对象。
是一种可以像函数一样被调用的对象,因此称为仿函数或者函数对象都比较贴切!
适配器
适配器:也叫配接器,扮演着转换器的作用
空间适配器
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!