参考资料
一. STL介绍
STL六大组件:
容器(Containers),算法(Algorithms),迭代器(Iterators),仿函数(Functors),适配器(Adapters),分配器(Allocators)
二. 容器
2.1 vector
向量容器,擅长在尾部插入或删除元素,在常量时间内就可以完成,时间复杂度为O(1);而对于在容器头部或者中部插入或删除元素,则花费时间要长一些(移动元素需要耗费时间),时间复杂度为线性阶O(n)。
- 内存是连续的,可以 at 和 [] 取元素(最好使用at的方式,out of range会提示报错)
- 迭代器可以++
2.1.1 头文件
#include <vector>
2.1.2 内部结构
2.1.3 用法
1. 构造
//默认构造,无参构造
vector<int> v1;
//预留内存
v1.reserve(100); //此时不能用v1.at() v1[]来赋值
//预留内存
v1.resize(100); //此时可以用v1.at() v1[]来赋值,默认是0
v1.resize(100, 1); //默认赋值1
//默认构造,有参构造
std::vector<int> test = {1,2,5,8,3,5};
//push_back empalce_back构造
for (int i = 0; i < 10; ++i)
{
v1.push_back(i);
}
//区间方式构造
vector<int> v2(v1.begin(), v1.end());
//n个element方式构造
vector<int> v3(10, 100); //10个100
//拷贝构造
vector<int> v4(v3);
2. 赋值
//直接赋值
vector<int> v2;
v2 = v1;
//assign赋值
vector<int> v3;
v3.assign(v1.begin(), v1.end());
//n个element赋值
vector<int> v4;
v4.assign(10, 100);
//初始化赋值
vector<int> v5 = {0,4,9};
//单个元素赋值
vector<int> v6;
v6.resize(10);
v6[0] = 10;
v6[1] = 60;
3. 插入删除
vector<int> v;
//尾插
v.push_back(10);
v.emplace_back(10); // emplace_back比push_back赋值次数少
//尾删
v.pop_back();
//插入 - 提供迭代器
v.insert(v.begin(), 100);
//插入两个值为 100 的元素
v.insert(v.begin(), 2, 100);
//删除 - 提供迭代器
v.erase(v.begin());
v.erase(v.begin(), v.end()); //相当于清空操作
v.clear(); //清空容器中所有元素,这个时候capacity还在
v.shrink_to_fit(); //清空元素之后再清空capacity
4. 容量和大小
//是否为空
v.empty()
//vector容器的容量为
v.capacity()
//vector容器的大小为
v.size()
//重新指定大小 - 变大
v.resize(15);
v.resize(15,10);
5.迭代器
v.begin() v.end() v.rbegin() v.rend()都是迭代器,由于内存时连续的,所以可以直接++操作
vector.begin()
返回一个指向向量起始位置的正向迭代器,可以通过 ++
操作来依次访问后续元素。
vector.rbegin()
返回一个指向向量末尾位置的反向迭代器,同样可以通过 ++
操作,但它会朝着向量的起始位置移动。
2.2 deque
内存是连续的