一、简介
C++ 标准库(STL大部分属于C++标准库) —STL和标准库的关系
STL 标准模板库
- 标准库以header files形式呈现
- C++标准库的header files不带副档名,如:#include
- 新式C header files,如:#include
- 旧式C header files,如:include<stdio.h>
新式headers内组件封装在namespace “std”(新式统一规定都在std)
using namespace std;(全部加载)
using std::cout;(cout单个)
网站:
书:
- THE C++ STANDARD LIBRARY第二版
- stl源码剖析(侯捷)
程序=数据结构+算法
二、STL六大部件(components)
容器(Containers):容器存储数据
分配器(Allocators):分配器为容器分配内存
算法(Algorithms):算法处理容器的数据
迭代器(Iterators):迭代器为算法提供访问容器的方式
适配器(Adapters):仿函数适配器为仿函数使用算法提供支持
仿函式(Functors):仿函数为类似不同的类相加减提供支持
//一个例子说明六大部件
#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(va,ia + 6);//<>符号表示模板,allocator<int>是一个分配器模板,一般vector都会自动默认使用分配器
cout << count_if(vi.begin(), vi.end(),
not1(bind2nd(less<int>(), 40)));
return 0;
}
//vector是一个容器containers
//count_if是一个算法algorithm,计算vi里面的个数
//vi.begin(), vi.end()是一个迭代器iterator
//less<int>是一个仿函数function
//bind2nd是一个适配器function adapter,绑定第二个参数为40
//notl是一个适配器function adapter,表示否定
//整个表达,vi大于等于40的个数
1.容器
容器规定:“前闭后开”区间(涵盖第一个不涵盖最后一个)
[)
旧版遍历:
Container<T> c;
...
Container<T>::iterator ite = c.begin();
for (; ite != c.end(); ++ite)
...
C++11遍历:
range-based for statement
for (int i: {2,3,4,5,6,7,8,9,10})
{
std::cout << i << std::endl;
}
std::vector<double> vec;
...
for (auto elem : vec) {
std::cout << elem << std::endl;
}
for (auto& elem : vec) {
elem *= 3; // elem = elem * 3
}
- 容器种类
- 顺序容器Sequence Containers
- Array(固定元素个数)C++11
- Vector(尾部个数可以扩充)
- Deque(头尾个数可以扩充)
- List(双向链表)
- Forward-List(单向链表)C++11
- 关联容器Associative Containers
- Set/Multiset(key=value)
- Map/Multimap(key对应value;multimap允许重复元素,map不允许有重复)
- 不定序容器Unordered Containers(属于关联容器)
HashTable Separate chaining(不定序容器使用hashtable):同放一个内存,内存放这几个数据的链表
下一节,从内存大小,存储方式,查找时间比对各个容器