【STL和泛型编程】1. STL基础和容器名称
1. STL 六大部件
STL的部件(Components)
- 容器(Containers)
- 分配器(Allocator)
- 算法(Algorithms)
- 迭代器(Iterators)
- 适配器(Adapters)——进行转换
- 仿函数(Functors)
这里是一个使用了全部6种STL部件的代码案例
#include <iostream> #include <vector> #include <algorithm> #include <functional> using namespace std; int main() { int p[6] = { 27, 210, 12, 47, 109, 83 }; // 容器(container): vector // 分配器(allocator): allocator<int> vector<int, allocator<int>> vi(p, p + 6); // 迭代器(iterator): vi.begin(), vi.end(); // 算法(algorithm): count_if (操作整个容器的头到尾) // 适配器(adapter): not1: 相反的, bind2nd: 绑定第二个参数 // 仿函数(function): 比他小 cout << count_if(vi.begin(), vi.end(), not1(bind2nd(less<int>(), 40))); // 计数:所有比40大的数 }
2. 迭代器(iterator)
// 获取一个迭代器 vector<int> vint; vector<int>::iterator it = vint.begin(); // C++11 for(auto elem : vint) { std::cout << elem << std::endl; }
3. 容器分类(container)
3.1 队列容器
- Array:事先分配元素个数的数组
- Vector:可以在尾部进行数组容量的扩充
- Deque:双端队列,可以在头部和尾部插入元素(pop_front、pop_back,push_front,push_back)
- Queue:队列,可以在尾部排队,头部离开
- List:双向链表
- Forward-List:单项链表
3.2 关系容器
- Set / Multiset:直接存储Value
- Map / Multimap:存储Key/Value,通过Key查找Value
- Unordered Set / Multiset:不进行排序
- Unordered Map / Multimap:不进行排序
-
array<int, 100> myArray:声明一个长度为100的array数组
- vector<int> myVector:声明一个变量类型为int的vector数组
- size() 当前元素个数
- capacity() 容量
- front() 第一个元素
- back() 最后一个元素
- data() 元素起始地址
- list<int> myList:声明一个变量类型为int的双向链表
- size() 当前元素个数
- max_size() 最大分配数量
- front() 首元素
- back() 为元素
- deque<int> myDeque:声明一个变量类型为int的双端队列(没有iterator,否则会破坏它的性质)
- queue:只保留了先进先出
- stack:只保留了后进先出
- multiset<int> myMultiSet:底层使用红黑树实现,插入完成排序
- insert() 插入元素
- size() 元素个数
- max_size() 最大存储数量
- find() 查找元素
- multimap<int, string> myMulitMap:底层使用红黑树实现,插入完成排序
- insert() 插入元素(自己完成组合 pair<int, string>)
- unordered_multiset<int> myUnMuSet:底层使用哈希表(开链法)
- bucket_count() 篮子的数量(大于元素数量)
- bucket_size(int n) 某个篮子内元素数量(可能为0)
- load_factor() 载重因子
- max_load_factor() 最大载重因子
- unordered_multimap<int, string> myUnMuMap:底层使用哈希表(开链法)