STL的体系结构
在leetcode的刷题过程中,有时调用到C++中的容器、迭代器,这些都封装在STL(Standard Template Library)中。偶然的机会,在B站看完侯捷老师的解析,据此作笔记记录一下,加深影响。
写在前面
使用一个东西,却不明白它的道理,不高明!
STL的六大部件(components)
- 容器(container)
- 分配器(allocator)
- 算法(algorithm)
- 迭代器(iterator)
- 适配器(adapter)
- 仿函式(functor)
六大部件之间的关系:
- 容器用来存储元素,实现是一种class
- 分配器用来给容器分配内存大小
- 迭代器用来实现容器中元素的访问,是算法和容器之间的桥梁
- 算法可以独立出来,通过迭代器作用到多种容器
- 适配器用做对象的包装,使之适应不同的接口实现
- 仿函式是一种用来实现函数功能的class
一个实例
#include<vector>
#include<algorithm>
#include<functional>
#include<iostream>
using namespace std;
int main(){
int ia[6] = {27, 210, 12, 47, 109, 83};
vector<int, allocator<int>> vi(ia, ia + 6);
cout << count_if(vi.begin(), vi.end(),
not1(bind2nd(less<int>(), 40)));
return 0;
}
- vector通过数组构建,container的使用
- allocator是容器构建中使用的分配器
- count_if是算法的一种,符合if条件则计数
- vi.begin()、vi.end(),调用的是迭代器
- not1、bind2nd是一种function adapter
- less()获得一个function object
容器的基础
前闭后开区间
容器c中的元素在[ c.begin(),c.end() )之间,当迭代器遍历到c.end()的时候,实际已经脱离容器的元素区间。
基本的遍历
使用for进行遍历
std::vector<double> vec;
for (auto& elem : vec){
std::cout << elem << std::endl;
}
reference
- 侯捷《STL源码剖析》
更多精彩文章,欢迎关注公众号“Li的白日呓语”。