STL
1. pair
二元组。可以看成是如下定义:
struct pair{
int first,second;
};
一般 pair 型变量定义的方式是: pair[HTML_REMOVED]p; pair[HTML_REMOVED]a[222];
pair 数组默认排序的依据是:优先按 first 升序进行排序。若 first 相等则按 second 升序进行排序。
2. vector
可变长度的数组。
vector<vector<int>> res(n,vector(n,0)); //
vector<int> a; //
a[i];
sort(a.begin(),a.end()); // 默认升序
<algorithm>
sort(a.begin(),a.end(),cmp);
若设计为非升序排序,则cmp函数的编写:
bool cmp(int a,int b)
{
return a>b;
}
⭐⭐⭐⭐重点!!
使用 vector 建图的技巧: 要求:
第一行输入 n 和 m,代表点数 和边数。 接下来的 m 行,每行输入两个数 x 和 y,代表x 和 y 有一条无向(有向)边
【样例输入】
4 5
1 2
2 3
4 2
1 4
3 4
建图的代码(请务必理解记忆,如果不能理解那么就当模板记下来):
vector<int>a[100010]; //建议 vector 数组开大点
int n,m;
cin>>n>>m; //n 代表顶点数量,m 代表边数量
for(int i=0;i<m;i++){
int x,y;
cin>>x>>y;
a[x].push_back(y);
a[y].push_back(x); //如果是有向边,该行省略
}
3.stack/queue/ deque/priority_queue
stack,即栈。
stack<int>s; //栈的定义
s.push(x); //将 x 压入栈顶
int tp=s.top(); //拿到栈顶元素(但不出栈)
s.pop(); //栈顶元素出栈
s.empty(); //返回一个 bool 型,若栈为空返回 ture,否则返回 false
s.size() //访问栈中的元素个数,如;
queue,即队列。
queue<int>s; //队列的定义
s.push(x); //x 入队
int tp=s.front(); //拿到队首元素(即将出队的元素),但不出队
s.pop(); //队首出队
deque,即双端队列,也叫双向队列。deque 的功能包含了栈和队列的功能,强烈建议大家掌握并熟练使用。
deque<int>s;
s.push_back(x); //队列末尾插入 x
s.push_front(x); //队列开头插入 x
s.pop_back(); //队列末尾弹出
s.pop_front(); //队列开头弹出
int ed=s.back(); //获取队列末尾的值,但不弹出
int op=s.front(); //获取队列开头的值,但不弹出
priority_queue,即优先队列。作用和最大(小)堆一样,可以 O(logn) 复杂度插入一个
priority<int>q; //优先队列的定义
priority_queue<int,vector<int>,greater<int>>q; //弹出最小值的优先队列的定义
q.push(x); //x 压入优先队列
int max=q.top(); //返回最大值,但不弹出
q.pop(); //弹出最大值
结构体优先队列的使用: 两种方法:
- 重载小于号
struct node{
//...
bool operator<(const node& a)const{...}
};
priority<node>q;
- 重写仿函数
struct node{
//结构体
};
struct cmp{
bool operator()(node a,node b){...}
};
priority<node,vector<node,cmp>q;
第一种方法适用于只需要一种优先队列。 如果需要多种优先队列,则用第二种方法(可以用多种 cmp 定义不同的优先队列)。
4. set/multiset
set:集合。每种元素最多出现一次。可以 O(logn) 插入/删除/查询。
set<int>s; //定义一个 set
s.insert(1); //往 set 里添加一个 1
s.erase(1); //将 set 里的 1 删除
if(s.count(x)) //判断 set 里是否有 x。由于 set 无重复,所以 count 的值只有可能 1 或 0
s.find(x) // 这个要查找,感觉还是count好用,count真香!
5. map
map 提供一对一的哈希。map 的调用/赋值均为 O(logn) 复杂度。
map<int,int>m; //前一个为 key,后一个为 value。
m[1]=2; //将键值为 1 的 value 赋值为 2。
m[99999999]=3; //将键值为 99999999 的 value 赋值为 3
erase() 删除一个元素
find() 查找一个元素
insert() 插入元素
6. 迭代器
迭代器有多种用法:容器的遍历,二分等
set 的遍历:
set<int>s;
for(set<int>::iterator it = s.begin();it!=s.end();it++){
cout<<(*it);
}
map 的遍历:
map<string,char>m;
for(map<string,char>::iterator it = m.begin();it!=m.end();it++){ cout<<(*it).first<<endl; // 输 出 key
cout<<(*it).second<<endl; //输出 value
}
学习知识点/刷题技巧(练习阶段)
-
不要刷过难的题见到新知识点->学习(学思路,不是学代码)->做模板题->做带该知识点tag的简单题
-
力求精通,不要“差不多先生”
•感觉自己可能没懂,一定要问,直到自己精通该知识点为止。
•感觉可能懂了,也一定要自己去做一些题目验证一下是不是真懂了。
•精通的判别标准:对于一个知识点,立刻能在脑海里形成代码,并迅速码出来。
- 练好自己debug的能力