首先,我们得知道什么是STL,STL统称为:“Standard TemplateLibrary 标准模板库”,STL提供了有六大组件,包括了容器,算法,迭代器,仿函数,适配器以及空间适配器。这些组件虽然听起来很陌生,相信学过c++基础,碰过数据结构算法的人一定不陌生,其实扮演的角色一样,名字不一样而已。比如以下所示:

- 容器:就是熟知的存储各种数据结构的容器;
- 算法:见名思义,就是各种常用的算法(比如:冒泡,排序算法等);
- 迭代器:这个可以看作成是一个指针,扮演了容器与算法之间的胶合剂的作用;
- 仿函数:行为类似熟知的函数,它的作用可作为算法的某种策略;
- 适配器:一种用来当作修饰(容器)或(仿函数)或(迭代器)接口的东西;
- 空间配置器(分配器):负责空间的配置与管理的作用;

其实对一般开发者而言,我们只要关心关注的是这三大组件就足够了“容器,算法,和迭代器”。这三者也分为以下好几类:
一、容器:
- 序列式容器:序列式容器就是容器元素在容器中的位置是由元素进入容器的时间和地点来决定;
- 关联式容器:关联式容器是指容器已经有了一定的规则,容器元素在容器中的位置由容器的规则来决定;
二:算法:
- 质变算法:是指运算过程中会更改区间内的元素的内容;
- 非质变算法:是指运算过程中不会更改区间内的元素内容;
三:迭代器:
- 双向迭代器:比如++,–可以访问下一个元素和上一个元素;
- 随机访问迭代器:比如+2,可以跳2个元素从而能够访问元素;
所以,以上三者就构成了不可分割的关系:“容器存储数据,并且提供迭代器,算法使用迭代器来操作容器中的元素”。

再此:我给大家举一个代码例子,方便刚入学的人们对这块有一个好的认知,就是STL的工作机制是如何实现的。我把演示代码拿给大家,如下代码所示:
#include<iostream>
using namespace std;
// 数组容器
template<class T>
class MyArray
{
public:
// 保护原生指针,给原生指针取别名
typedef T* iterator;
MyArray()
{
mCapacity = 10;
mSize = 10;
p = new T[mCapacity];
for (int i = 0; i < mCapacity; i++)
{
p[i] = i + 1;
}
}
// 提供迭代器,开始位置的迭代器
T* begin(){
return p;
}
// 返回结束位置的迭代器
T* end(){
return p + mSize;
}
private:
T* p;
int mCapacity;
int mSize;
};
// 算法
template<class T>
void printArray(T begin, T end)
{
for (; begin != end; ++begin)
{
cout << *begin << " ";
}
cout << endl;
}
void test()
{
MyArray<int> arr;
// 获取容器提供的开始位置迭代器
MyArray<int>::iterator begin = arr.begin();
// 获取容器提供的结束位置迭代器
MyArray<int>::iterator end = arr.end();
printArray(begin, end);
}
int main()
{
test();
system("pause");
return EXIT_SUCCESS;
}
以上只是给大家一个粗略的代码例子,知道有这么个好东西就可以了,若有代码要完善的地方请先抛开,只要是为了演示而已,请见谅,若有更好的优化建议,也可以留言互相讨论,那非常感谢!当然,c++的知识量很庞大,STL标准模板库有很多的容器,都需要大家一一去学习,比如常用的string容器,vector容器,deque容器,list容器,set/multiset容器,map/multimap容器等等,一两句话也说不清楚,具体还需要大家去搜索资料跟着实操和深度理解。
总结:在C++编程中,为何要用STL标准模板库来写代码的理由?当然我本人强烈建议用 string、vector 等更高封装层次的基础组件,因为大佬们写好的模板库在很多使用场景中,成熟的代码,效率更好,安全性更高,有好的轮子不用,为何须要独自再造轮子呢?这些标准模板库最主要还可以代替原始指针和动态数组,对提高代码的可读性和安全性都有很大的帮助。可以消除绝大多数 delete[] 的使用场景,并且代码更清晰。同时建议返回 string、vector 等类型,会让代码更加简单和安全。像string、vector 可以代替手动内存分配,代替原始指针和数组操作,代替原始内存管理机制,可以大量减少这类错误等等。
内容来源转载自知乎ArveyCheung账号的文章:https://zhuanlan.zhihu.com/p/405415385