STL六大部件:
- 容器 container:存储数据,用户不必关心数据在内存的存储形式,只需要知道怎么用容器接口
- 分配器 allocator:帮助容器在内存规划位置
- 算法 algorithm:与数据分离,能够执行某种操作
- 迭代器 iterator:连接容器(数据)和算法(操作)的桥梁,好像一种泛化指针
- 适配器 adapter:进行转换,可以针对容器、仿函数、迭代器
- 仿函数 Funtor:作用像一个函数
标准库规定,容器的头尾是前闭后开,即[ )类型
C++11新规定的遍历方式
for (decl : coll) {
statement
}
//decl是declare,声明一个变量
//coll是collection,表示一个元素集合/容器
//示例1:遍历集合中的元素
for (int i :{2,3,4,5}) {
cout << i << endl;
}
//示例2:传值输出集合中的元素
for (auto e : vec) {
cout << e << endl;
}
//示例3:传址修改集合中的元素
for (auto& e : vec) {
e *= 3;
}
容器分类
序列式容器
array:由C++本身的数组包装得到。大小固定,不能改变
vector:能够自动扩充的数组,只能在尾部扩充
deque:双向队列,可以在头尾扩充
list:双向链表
forward-list:单向链表
关联式容器
有key和value,因为能够根据key查找value,所以关联式容器十分适合需要大量查找的数据
set/multiset:底层红黑树。key就是value,即红黑树的每个节点上只存储一个key值,该key值就=value值。
set表示存放元素的key不能重复,multiset表示存放元素的key可以重复
map/multimap:底层红黑树。key和value分开存放,即红黑树的每个节点上既要存储key值,还要存储value值。
map表示存放元素的key不能重复,multimap表示存放元素的key可以重复
以红黑树为底层的关联式容器,key值都是有序存放的,因为红黑树本身就是有序的
无序式容器
其实也是一种关联式容器,但是独立了出来
unordered set/multiset:底层哈希表。
unordered map/multimap:底层哈希表。
以哈希表为底层的无序式容器,key值都是无序存放的,因为哈希表本身就是无序的