一、六大部件
STL6大部件之间的关系:
- container(容器)通过allocator(配置器)取得数据储存空间,
- algorithm(算法)通过iterator(迭代器)存取container(容器)内容,
- functor(仿函数)可以协助algorithm(算法)完成不同的策略变化,
- adapter(配接器)可以修饰或套接functor(仿函数)
代码 ------- 简单实现6种部件的代码
#include <iostream>
#include <vector>
#include <functional>
#include <algorithm>
using namespace std;
int main() {
int a[6] = {27 , 210 , 40 , 12 , 47 , 92};
/*
allocator<int> 是 分配器 但是通常vector有
默认的分配器 所以通常省略
========= 分配器
*/
/*vector ======= 容器*/
vector<int,allocator<int> > vi(a , a + 6);//此时vi 得到了 a[0] - a[1]的值
//count_if 是 计量函数 计算符合标准的元素有几个 ========= 算法
//范围是 vi.begin()-----vi.end() ======== 迭代器
//bind2nd(less<int>() , 40) --- 小于40的元素 ========= 仿函式 + 适配器
//not1() ---- 否定作用 ========= 仿函式 + 适配器
cout << count_if(vi.begin(),vi.end(),
not1(bind2nd(less<int>(), 40))) << endl;//不小于四十的数量 ---> 大于等于四十的数量 ----> 4
return 0;
}
- 1、容器(Containers):各种数据结构,如:vector、list、deque、set、map。用来存放数据。从实现的角度来看,STL容器是一种class template。
- 2、算法(algorithms):各种常用算法,如:sort、search、copy、erase。从实现的角度来看,STL算法是一种function template。
- 3、迭代器(iterators):容器与算法之间的胶合剂,是所谓的“泛型指针”。共有五种类型,以及其他衍生变化。从实现的角度来看,迭代器是一种将operator*、operator->、operator++、operator- -等指针相关操作进行重载的class template。所有STL容器都有自己专属的迭代器,只有容器本身才知道如何遍历自己的元素。原生指针(native pointer)也是一种迭代器。
- 4、仿函数(functors):行为类似函数,可作为算法的某种策略(policy)。从实现的角度来看,仿函数是一种重载了operator()的class或class template。一般的函数指针也可视为狭义的仿函数。
- 5、配接器(adapters);一种用来修饰容器、仿函数、迭代器接口的东西。例如:STL提供的queue和stack,虽然看似容器,但其实只能算是一种容器配接器,因为它们的底部完全借助deque,所有操作都由底层的deque供应。改变functors接口者,称为function adapter;改变Container接口者,称为container adapter;改变iterator接口者,称为iterator adapter。
- 6、配置器(allocators):负责空间配置与管理。从实现的角度来看,配置器是一个实现了动态空间配置、空间管理、空间释放的class template。
二、前闭后开区间
三、C++的特殊迭代器
四、复杂度
五、auto关键字