STL(Standard Template Library,标准模板库)
STL从广义上分为:容器(container) 算法(algorithm) 迭代器(iterator)
容器和算法之间通过迭代器进行无缝连接
STL六大组件:
容器:各种数据结构,如vector、list、deque、set、map等
算法:如sort、find、copy、for_each
迭代器:扮演了容器与算法之间的胶合剂,共有五种类型。
仿函数:
适配器:
空间配置器:
STL六大组件的交互关系
容器通过空间配置器取得数据存储空间,算法通过迭代器存储容器中的内容,仿函数可以协助算法完成不同的策略的变化,适配器可以修饰仿函数。
STL高可重用性,高性能,高移植性
STL三大组件
容器:分为序列式容器和关联式容器两种
序列式容器(原顺序)
关联式容器(有顺序,可自己制定)
算法:分为质变算法和非质变算法
质变算法:是指运算过程中会更改区间内的元素的内容。例如拷贝,替换,删除等等
非质变算法:是指运算过程中不会更改区间内的元素内容,例如查找,计数,遍历,寻找极值等等
迭代器依序寻访某个元素所含的各个元素
输入迭代器 | 提供对数据的只读访问 | 只读,支持++、==、!= |
---|---|---|
输出迭代器 | 提供对数据的只写访问 | 只写,支持++ |
前向迭代器 | 提供读写操作,并能向前推进迭代器 | 读写,支持++、==、!= |
双向迭代器 | 提供读写操作,并能向前和向后操作 | 读写,支持++,– |
随机访问迭代器 | 提供读写操作,并能以跳跃的方式访问容器的任意数据,是功能最强的迭代器 | 读写,支持++、–、[n]、-n、<、<=、>、>= |
我们可以把迭代器当指针理解,以下以遍历代码说明
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
#include <vector>
//容器
void test02()
{
vector<int> v; //声明一个容器
v.push_back(10);
v.push_back(20);
v.push_back(30);
v.push_back(40);
//遍历容器中的数据 利用迭代器
vector<int>::iterator itBegin = v.begin(); //itBegin指向的是v容器中的起始位置
vector<int>::iterator itEnd = v.end(); //itEnd指向v容器中的最后一个位置的下一个地址
while (itBegin != itEnd)
{
cout << *itBegin << endl;
itBegin++;
}
}
//迭代器 遍历功能 用指针理解
//普通指针也算一种迭代器
void test01()
{
int array[5] = { 1,3,5,6,8 };
int* p = array; //指针指向数组首地址 &array[0]
for (int i = 0; i < 5; i++)
{
cout << *(p++) << endl;
}
}
int main()
{
test01();
test02();
system("pause");
return EXIT_SUCCESS;
}
test02中的迭代器效果与test01中的cout<<*(p++)<<endl;类似
还有两种遍历方法如下代码所示
//第二种遍历方式
//for(int i =0;i<10;i++)
for (vector<int>::iterator it = v.begin; it != v.end; it++)
{
cout << *it << endl;
}
//第三种方式 利用算法
for_each(v.begin(), v.end(),myPrint);
}
其中for_each的底层实现
// FUNCTION TEMPLATE for_each
template <class _InIt, class _Fn>
inline _Fn for_each(_InIt _First, _InIt _Last, _Fn _Func) { // perform function for each element [_First, _Last)
_Adl_verify_range(_First, _Last);
auto _UFirst = _Get_unwrapped(_First);
const auto _ULast = _Get_unwrapped(_Last);
for (; _UFirst != _ULast; ++_UFirst) {
_Func(*_UFirst);
}
return _Func;
}
总代码
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
#include <string>
#include <vector>
#include <algorithm>
void myPrint(int v);
//容器
void test02()
{
vector<int> v; //声明一个容器
v.push_back(10);
v.push_back(20);
v.push_back(30);
v.push_back(40);
//遍历容器中的数据 利用迭代器
vector<int>::iterator itBegin = v.begin(); //itBegin指向的是v容器中的起始位置
vector<int>::iterator itEnd = v.end(); //itEnd指向v容器中的最后一个位置的下一个地址
//while (itBegin != itEnd)
//{
// cout << *itBegin << endl;