再也不想上机的时候手写堆了。
万能头:
#include <bits/stdc++.h>vector 变长数组
动态数组,可以变长。
头文件:
#include <vector>初始化
// 一维
vector<int> a; // <>里面写数据类型
vector<int> v(n); // 指定长度为n,初始值均为0
vector<int> v(n, 114514); // 指定长度为n、初始值都是n-1
vector<int> a{1,2,3,4,5}; // 初始化,数组长度为5
// 拷贝初始化
vector<int> a(n, 1);
vector<int> b(a); // b也是长度为n、初始值为1的数组
vector<int> c = a; // 另一种拷贝初始化方法
// 二维
vector<int> v[5]; // 第一维固定长度5,第二位可变长
vector<vector<int>> v; // 二维长度均可变,可以直接push_back进去一个数组
vector<vector<int>> a(n, vector<int>(n, 0)); // 行列均长度n且初始值为0方法
a.front(); // 第一个数
a.back(); // 第二个数
a.size(); // 返回数据个数
a.begin(); // 返回数组首地址迭代器
a.end(); // 返回数组尾地址迭代器(最后一个元素的下一个位置)
a.empty(); // 是否为空
a.assigm(beg, end); // 将另一个容器[x.begin(), x.end()]拷贝到a里面
a.pop_back(); // 删除最后一个元素
a.push_back(element); // 最后面加一个元素
a.insert(pos, x); // 向任意迭代器pos插入一个元素x
a.resize(n, v); // 改变数组大小为n,且赋值为v
a.erase(first, last); // 删除[first, last)之间的元素访问
// 方法1: 下标
a[1]; // 第二个元素
// 方法2:迭代器
// 类似于指针,变量类型为vector<int>::iterator
vector<int>::iterator it = vi.begin(); //声明一个迭代器指向vi的初始位置
cout << *(it + 1) << endl; // 类似于指针,使用*解引用
// 方法3:使用auto
for(auto x: a){
cout << x << endl;
}stack 堆
栈。但不如直接模拟方便。
#include <stack>
stack<int> s;
s.push(element);
s.pop();
s.top(); // 获取堆顶元素
s.empty();
s.size();queue 队列
队列。也是自己拿数组模拟更好。
#include <queue>
queue<int> que;
que.front(); // 获取队首元素
que.back(); // 获取队尾元素
//... 其他和stack一样deque 双向队列
首尾均可插入删除
#include<deque>
deque<int> dq;
push_back(x); push_front(x); // 前后插入
back(); front(); // 返回前或后
pop_back(); pop_front(); // 删除首尾priority_queue 优先队列
优先队列,可以定义大顶堆、小顶堆等,可以自定义比较规则。
#include <queue>
priority_queue<int> q;常用方法
q.top();
q.push();
q.pop();
q.size();
q.empty();排序规则
priority_queue<int, vector<int>, greater<int>> q; // 小顶堆- 第一个参数:储存数据类型
- 第二个参数:存放底层数据结构堆的容器,改
<int>里面的int就可以 - 第三个参数:比较方法,自带的有
less<int>和greater<int>(分别大顶堆、小顶堆)。 - 无比较参数默认为大顶堆。
主要是排序比较函数的写法。比较函数返回1代表不满足规则,返回0代表不需要改变顺序。所以比较函数和正常的想法可能是反着的,比如return小于号得到的是一个大顶堆。
定义里面的cmp是一个struct结构体。有以下的定义方法:
// 单独定义一个比较结构体
struct cmp{
bool operator()(const Point& a, const Point$ b){
return a.x < b.x;
}
}
priority_queue<Point, vector<Point>, cmp> q; // 对x的大顶堆
// 或者直接在数据的结构体里面写
struct Point {
int x, y;
friend bool operator < (Point a, Point b) {//为两个结构体参数,结构体调用一定要写上friend
return a.x < b.x; //大根堆,按x从小到大排,x大的在堆顶
}
}
priority_queue<Point> q; // 相当于给结构体写了一个自带比较方法对于pair类型,先对first进行降序排序,再对second进行降序排序。
map 映射
未完待续…
参考: wyqz.top/p/870124582.html