前言
STL 从广义上分为: 容器(container) 算法(algorithm) 迭代器(iterator),容器和算法之间通过迭代器进行无缝连接。STL 几乎所有的代码都采用了模板类或者模板函数,这相比传统的由函数和类组成的库来说提供了更好的代码重用机会。
一、STL六大组件简介
容器: 各种数据结构,如vector、list、deque、set、map等,用来存放数据,从实现角度来看,STL容器是一种class template。
算法: 各种常用的算法,如sort、find、copy、for_each。从实现的角度来看,STL算法是一种function tempalte.
迭代器: 扮演了容器与算法之间的胶合剂,共有五种类型,从实现角度来看,迭代器是一种将operator* , operator-> , operator++,operator–等指针相关操作予以重载的class template. 所有STL容器都附带有自己专属的迭代器,只有容器的设计者才知道如何遍历自己的元素。原生指针(native pointer)也是一种迭代器。
仿函数: 行为类似函数,可作为算法的某种策略。从实现角度来看,仿函数是一种重载了operator()的class 或者class template
适配器: 一种用来修饰容器或者仿函数或迭代器接口的东西。
空间配置器: 负责空间的配置与管理。从实现角度看,配置器是一个实现了动态空间配置、空间管理、空间释放的class tempalte.
二、STL的优点
1.STL是C++的一部分,所以不需要额外安装什么,它已经在编译器之内。
2.STL的一个重要特性是将数据和操作分离。数据由容器类别加以管理,操作则由可定制的算法定义,迭代器是中间者,使算法可以和容器交互运作
3.STL具有高可用性,高性能,高移植性,跨平台的优点。
<1>高可重用性:STL 中几乎所有的代码都采用了模板类和模版函数的方式实现,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。关于模板的知
识,已经给大家介绍了。
<2>高性能:如 map 可以高效地从十万条记录里面查找出指定的记录,因为 map 是采用红黑树的变体实现的。
<3>高移植性:如在项目 A 上用 STL 编写的模块,可以直接移植到项目 B 上。
三、STL的缺陷
1.更新慢
2.不支持线程安全,并发环境下要自己加锁,且锁的粒度较大
3.内部结构复杂
4.导致代码膨胀(模板的语法导致)
四、STL三大组件
1.容器
常用的数据结构:数组(array),链表(list),tree(树),栈(stack),队列(queue),集合(set),映射表(map),根据数据在容器中的排列特性,这些数据分为序列式容器和关联式容器两种。
1.序列式容器强调值的排序,序列式容器中的每个元素均有固定的位置,除非用删除或插入的操作改变这个位置。Vector容器、Deque容器、List容器等。
2.关联式容器是非线性的树结构,更准确的说是二叉树结构。各元素之间没有严格的物理上的顺序关系,也就是说元素在容器中并没有保存元素置入容器时的逻辑顺序。关联式容器另一个显著特点是:在值中选择一个值作为关键字key,这个关键字对值起到索引的作用,方便查找。Set/multiset容器 Map/multimap容器
2.算法
算法分为:质变算法和非质变算法。
1.质变算法:是指运算过程中会更改区间内的元素的内容。例如拷贝,替换,删除等等
2.非质变算法:是指运算过程中不会更改区间内的元素内容,例如查找、计数、遍历、寻找极值等等
3.迭代器
迭代器是一种抽象的概念,迭代器的主要作用就是在于将容器(container)和算法(algorithms)分开。
注:本文主要参考https://blog.csdn.net/qq_42754132/article/details/100058133