前言:
一:何为STL
二:容器
2.1:容器的分类
(1)序列式容器
(2)关联式容器
2.2:vector容器浅析
(1)使用方式:
(2)基本结构
三:算法(C++中算法头文件)
(1)算法的作用:
(2)算法的分类:
四:迭代器
(1)迭代器的类型
(2)迭代器浅析:
begin() 和 end()
定义和初始化
五:使用案例
前言:
STL细分下来其实有六大组件,除去容器算法和迭代器外,还有:仿函数(函数对象),适配器,和空间配置器。这里我们只讨论前三个比较重要的组件。
一:何为STL
STL全称为(Standard Template Library,标准模板库)。为了建立数据结构和算法的一套标准,并且降低他们之间的耦合关系,从而诞生了STL。
二:容器
容器就是各种数据结构的统称,如vector、list、deque、set、map等,用来存放数据,从实现角度来看,STL容器是一种class template(类模板)。
2.1:容器的分类
(1)序列式容器
像vector、list、deque等都是序列式容器,序列式容器在对数据进行存储的时候,就是按照存储时候的顺序那样存放的(就像普通数组一样)。容器本身是不会对这些数据进行排序的。如果有排序的需求,那么就需要使用系统提供的算法或者自身提供的算法了。
(2)关联式容器
像set、map等容器都是关联式容器,这些容器在填充数据时,他们是没有push_back这样的方法,他们填充数据的方法都是 insert 。在填充数据时也会自动的按照默认的排序规则对填充的数据进行排序。
下面我们通过vector使用简单的了解一下容器。
2.2:vector容器浅析
(1)使用方式:
对于任何一种容器来说,都有它对应的头文件(头文件名与容器名称相同),在声明出哪种类型的vector容器时,需要指定它的类型。这种定义方式就是类模板的声明对象的方式。这也对应了前面STL的含义(标准模板库)。
(2)基本结构
vector容器是一个简单的单端动态数组结构:
1 单端:因为该容器对象对外提供的填充数据的方法只有尾插,删除数据也只有尾删 。
2 动态数组:在对该类对象进行使用时,他在内部会自动的进行空间的扩容,不需要我们来关心空间的分配。(其实对于所有的STL容器基本都有这个功能)
三:算法(<algorithm>C++中算法头文件)
(1)算法的作用:
这里说的算法其实和我们平常使用的一些普通算法差不多,只不过这里讲的算法是只被容器适用的算法。就像上面的vector容器来说,如果我们是按照无序的方式插入的数据(比如插入 2,5,6,4,9等,那么他们在容器里就像普通数组那样,按照存储的顺序排放),那么我现在需要将里面数据的进行顺序(或者逆序)的排序,就需要用到算法了。
(2)算法的分类:
质变算法:在运算过程中对区间内的元素内容进行修改,例如拷贝,替换,删除之类。
非质变算法:在运算过程中没有对区间内的元素内容进行修改,只是简单的进行,查找,计数,遍历等。
四:迭代器
它扮演了容器与算法之间的胶合剂,所有STL容器都附带有自己专属的迭代器,只有容器的设计者才知道如何遍历自己的元素。所以说,我们想遍历某一个容器,就必须使用这个容器的迭代器才可以。
(1)迭代器的类型
输入(只写),输出(只读) 迭代器
前向迭代器:可读可写,但只能进行++操作,不能--(在类内没有对--运算符进行重载)
双向迭代器:可读可写,能进行++与--的操作。
随机访问迭代器:可读可写,能进行++与--的操作。它还可以进行跳跃式访问容器。
现在使用的多的一些容器,如vector、deque、set、map等容器的迭代器都是随机访问迭代器。
而list容器(链表容器)是不支持随机访问的,所以他也不支持系统提供的算法,但是对于这些不支持系统提供的算法的容器,他们内部会提供自己的算法,使用起来和系统提供的算法大同小异啊。
(2)迭代器浅析:
begin() 和 end()
首先在认识迭代器之前,我们需要来了解两个函数,begin() 和 end(),这两个函数在每个容器内都存在,并且代表的含义是完全一样的。
我们还是用vector来进行简单说明
begin()函数,返回的是该容器第一个元素的地址。
end()函数, 返回的是该容器最后一个元素的下一个元素的地址。(注意这里不是最后一个元素的地址哦.)
当然这两个函数返回的数据,必须使用对应容器的迭代器去接收,不然的话编译器会报错。
所以根据上面的解释,我们可以把迭代器简单理解成数组元素的指针,
定义和初始化
五:使用案例
最后呢,用一个简单的小案例,来总的使用一下STL的三大组件
#include<algorithm>//系统算法头文件
bool mycompare(int v1, int v2)
{
return v1 > v2;
}
void test()
{
vector<int>v;//容器
for (int i = 0; i < 10; i++)
{
v.push_back(i);
}
vector<int>::iterator it = v.begin();//迭代器
vector<int>::iterator mit = v.end();
for (it; it != mit; it++)
{
cout << *it << " ";
}
cout << endl;
sort(v.begin(), v.end(), mycompare);//算法
for (it = v.begin(); it != mit; it++)
{
cout << *it << " ";
}
}
int main()
{
test();
return 0;
}
案例结果如下:
STL中的容器与算法是分开的,迭代器就是二者之间的粘合剂,我们一般使用容器去存放数据,使用算法配合迭代器去遍历这些容器。