vector
vector可以理解为变长的动态数组,内部基于倍增思想
#include<vector> 头文件
vector<int>a 一个动态变化的数组a
vector<int>v[100] 一个第一维是100,第二维动态变化的数组
struct emmm {...
}
vector<emmm>c 结构体类型也可以在vector中使用
size/empty
size函数返回的是vector的长度
empty函数返回的是一个bool类型,表示vector是否为空
clear
将vector清空
迭代器
迭代器像一个指针,可以用*解除引用
一个保存int类型的迭代器声明方式:
vector<int>::iterator a;
(至于迭代器小编本身也不是很会 在这里不多说了)
queue
queue里面主要包含循环队列queue和优先队列priority_queue
声明:
queue<int>q;
prtority_queue<int>q;
prtority_queue<pair<int, int> >q;
queue
入队(从队尾)push 如q.push(x);
出队(从队头)pop 如q.pop();
队头元素 front 如 int a = q.front();
队尾元素 back 如 int b = q.back();
prtority_queue
其实 优先队列可以理解为一个大根二叉堆
重载<运算符
如果你使用的是自定义类型 那么你需要重载运算符了
struct emmm{
int a, b;
};
bool operator<(const ...&a, const...&b) {
return ....
}
小根堆
主要有3种,可我只会2种
1:proority_queue<int, vector<int>, greater<int> >q;
一个int类型的优先队列可以通过上面来定义
2:在插入时直接插入那个数的相反数 用的时候再取相反数
deque
此为双端队列 是一种支持双端插入或删除元素的线性储存空间 类似于vector和queue的结合
头/尾迭代器 :begin/end
队头/尾元素:front/back
队头/尾入队:q.push_front/back
队头/尾出队:q.pop_front/back
清空队列:q.clear();
set
set为集合 包括set和multiset两部分 前者是“有序集合”, 后者是“有序多重集合”
声明
set<int> s;
struct emmm{...}; set<emmm> s;
multiset<double> s;
insert
s.insert(x)把一个元素x插入到集合s中
在set中 如果已经存在x 则不会重复插入 无影响
find
s.find(x)在集合s中查找等于s的元素,并返回该元素的迭代器
count
s.count(x)返回集合中等于s的元素的个数
map
map为映射
声明
map<int, int>q;
map<string, int>q;
map<long long, bool>vis;
map<make_pair<int, int>, vector<int> >test;
algorithm
reverse
翻转一个vector
reverse(a.begin(), a.end());
翻转一个数组
reverse(a + 1, a + n + 1);
random_shuffle随机打乱
用法同reverse
sort快排
将一个int数组从小到大排序
sort(a + 1, a + n + 1);
自定义排序 例如从大到小
int a[100];
bool cmp(int a, int b){return a > b;}
sort(a + 1, a + n + 1, cmp);
自定义结构体vector排序
struct rec {int id, x, y};
vector<rec> a;
bool operator <(const rec &a, const rec &b) {
return ...;
}
sort(a.begin(), b.begin());
lower_bound/upper_bound
lower_bound的第三个参数x,在其中进行二分查找 返回指向第一个大于等于x的元素的位置的迭代器(或指针)
upper_bound的用法和lower_bound相似 唯一的区别是upper_bound查找的是第一个大于x的位置
要求是有序序列
在有序int数组中查找第一个大于等于x的最小整数的下标
int i = lower_bound(a + 1, a + n + 1, x) - a;