STL1:简介
1、背景
1.1 STL是什么?
STL(Standard Template Library)标准模板库的英文缩写,包含有计算机科学领域常用的基本数据结构和基本算法。
1.2 STL与C++标准库的关系
1.3 版本
2、STL的组成
No. | Component | 部件 | 作用 |
---|---|---|---|
1 | Container | 容器 | 存储数据 |
2 | lterator | 迭代器 | 遍历容器数据 |
3 | Adaper | 适配器(配接器) | 容器转换 |
4 | Algorithm | 算法 | 通用算法 |
5 | Function Object/Functor | 函数对象/仿函数 | |
6 | Allocator | 分配器(配置器) | 分配释放内存 |
程序 = 数据结构(容器) + 算法
迭代器是容器与算法的桥梁
3、容器分类
分类原则:结构
No. | Container | 容器 | e.g. |
---|---|---|---|
1 | Sequence Container | 顺序容器(序列容器) | vector,list,deque |
2 | Associative Container | 关联容器 | map,``multimap,set,multiset` |
3 | Container Adapter | 容器适配器 | stack,queue,priority_queue |
4、迭代器分类
4.1 分类原则:访问方式
No. | lterator | 迭代器 | 能力 | e.g. |
---|---|---|---|---|
1 | Input Iterator | 输入迭代器 | 向前读取能力 | istream_iterator |
2 | Output Iterator | 输出迭代器 | 向前写入能力 | ostream_iterator |
3 | Forward Iterator | 向前迭代器 | 向前读取写入能力 | - |
4 | Biredirectional Iterator | 双向迭代器 | 双向读取写入能力 | list,map,set的iterator |
5 | Random-Access Iterator | 随机访问迭代器 | 随机读取写入能力 | string,vector,deque的iterator |
4.2 分类原则:操作类型
No. | lterator | 迭代器 | e.g. |
---|---|---|---|
1 | iostream Iteractor | iostream迭代器 | istream_iteractor,ostream_iteractor |
2 | Insert Iteractor | 插入迭代器 | back_inserter,front_inserter,inserter |
3 | Reverse Iteractor | 反向迭代器 | reverse_iteractor |
4.3 测试
#include <iostream>
#include <vector>
using namespace std;
int main(){
vector<int> vec;
int n;
while(cin>>n){
vec.push_back(n);
}
for(int i=0;i<vec.size();i++){
cout << vec[i] << endl;
}
//指针遍历数组
int arr[] = {1,2,3,4,5,6};
int *p = arr;
while(p!=arr+6){
cout << *p << " ";
++p;
}
cout << endl;
//迭代器遍历数组
int *q = begin(arr);
while(q!=end(arr)){
cout << *q << " ";
++q;
}
cout << endl;
//迭代器
vector<int>::iterator it=vec.begin();
while(it != vec.end()){
cout << *it << " ";
++it;
}
cout << endl;
//const 迭代器
const vector<int> cvec = vec;
vector<int>::const_iterator cit = cvec.cbegin();
while(cit!=cvec.cend()){
cout << *cit << " ";
++cit;
}
cout << endl;
//C++11 begin() end()
vector<int>::iterator it2 = begin(vec);
while(it2 != end(vec)){
cout << *it2 << " ";
++it2;
}
cout << endl;
//C++11 base--scope--for
for(int n:arr){
cout << n << " ";
}
cout << endl;
for(int n:vec){
cout << n << " ";
}
cout << endl;
}
5、适配器分类
分类原则:适配部件
No. | Adapter | 适配器 | e.g. |
---|---|---|---|
1 | Container Adapter | 容器适配器 | stack,queue,priority_queue |
2 | Iterator Adapter | 迭代适配器 | back_inserter,front_inserter,inserter |
3 | Function-Object Adapter | 函数对象适配器 | bind1st,bind2nd,not1,not2 |
6、算法分类
分类原则:按操作类型
No. | Algorithm | 算法 | e.g. |
---|---|---|---|
1 | Read Only | 只读算法 | find,count,search,for_each,mismatch,equal,binary_search |
2 | Write Only | 只写算法 | fill,generate,copy,transform,merge,swap,replace |
3 | Sort | 排序算法 | sort,stable_sort,reverse |
7、函数对象分类
分类原则:运算类型
No. | Algorithm | 算法 | e.g. |
---|---|---|---|
1 | Arithmetic Function-Object | 算术函数对象 | plus,minus,multiplies,divides,modulus,negate |
2 | Relational Function-Object | 关系函数对象 | equal_to,not_equal_to,less,less_equal,greater,greater_equal |
3 | Logical Function-Object | 逻辑函数对象 | logical_and,logical_or,logical_not |
8、分配器
功能:获取释放内存