pair
定义:pair<变量类型1,变量类型2>a(1-值,2-值)。
a = make_pair(1-值,2-值);
访问:1-a.first 2-a.second
比较:a < b -> ( a.first < b.first || a.first == b.first && a.second < b.second; )
可以嵌套:pair<int,pair<int,int>>b(1, pair<int,int>(2,3));
array
定义:array<int, 5(数组大小)>a; (等于int a[5])
auto [p, q, r] = b; // p = b[0], q = b[1], r = b[2]
stack(栈) 先进后出
定义:stack<变量类型>s;
入栈:s.push(值);
访问栈顶元素:s.top();
出栈(删除栈顶元素):s.pop();
栈的长度:s.size();
栈为空的时候返回true:s.empty();
queue(队列) 先进先出
用法:bfs
定义:queue<变量类型>q;
入队:q.push(值);
出队:q.pop();
访问第一个元素:q.front();
访问最后一个元素:q.back();
队列为空的时候返回true:q.empty();
priority_queue(优先队列)
用法:大根堆top为最大值,小根堆top为最小值。
默认大根堆。
定义:priority_queue<变量类型>v;
v.push(值);
v.top();
小根堆:1.给每个值取反(x->-x)如图所示:
(大根堆)
点击查看代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
priority_queue<int> v;
int main() {
v.push(3);
v.push(1);
v.push(2);
while (!v.empty()) {
int x = v.top();
printf("%d\n", x);
v.pop();
}
}
点击查看代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
priority_queue<int> v;
int main() {
v.push(-3);
v.push(-1);
v.push(-2);
while (!v.empty()) {
int x = v.top();
printf("%d\n", -x);
v.pop();
}
}
deque(双端队列)
用法:可以在两端进行插入删除操作
定义:deque<int>v;
头部插入:v.push_front(1);
头部删除:v.pop_front();
尾部插入:v.push_back(2);
尾部删除:v.pop_back();
可以按照下标访问,例:v[];
vector
初始化:
vector<int>v;
vector<int>v(3,100);(大小为1,每个值为100)
vector<int>v{1,2,3};(v[0] = 1,v[1] = 2,v[2] = 3;)
从最后放入元素:
v.push_back(1);
遍历:
for(auto x: v){
printf("%d ",x);
}
x为临时变量,改变x不会改变v的值。
使用&x=引用v中对应变量,v的值会随着x改变。
预处理大小:v.risize(100);
大小:v.size();(当v是空的时,v转为无符号类型,v.size()大小为2^32,为了避免算大小应该用(int)v.size();)
清空:v.clear();
迭代器:指向元素的东西。auto it = v.begin();//指向第一个元素。
指向下一个元素:
it ++;
*it += 1;
在第一个位置插入2:
v.insert(v.begin() + 1, 2);
删除第二个位置的元素:
v.erase(v.begin + 2)。
排序:
#include<algorithm>
sort(v.begin(),v.end());
返回大于等于x的第一个位置:
auto it1 = lower_bound(v.begin(), v.end(), x);
返回大于x的第一个位置:
auto it2 = upper_bound(v.begin(), v.end(), x);
x在v中的元素个数 = it2 - it1。
vector之间比较按照字典序。
set

初始化:
set<T>s;
v中所有元素存到s中set<T>s(v.begin(),v.end());
删除元素x:
s.erase(x);
遍历:
for (auto it = s.begin(); it != s.end(); it++) {
printf("%d\n", *it);
}
查询x是否存在:
s.count(x);(返回0 or 1)
s.find(x);(返回迭代器,找不到返回s.end())
返回大于等于x的第一个元素迭代器:
auto it1 = lower_bound(x);
it的前一个元素:
prev(it);
--it;
插入:s.insert(x);
map

初始化:
map<T1,T2>v;
T1:下标类型
T2:值的类型
访问:
第一个:x.first 第二个:x.second
定义:
v["abc"] = "def";
遍历:
for (auto x : s) {
cout << x.first << " : " << x.second << endl;
}
当访问一个不存在的下标x,会新建一个使v[x] = 0;所以在判断一个元素是否等于0,则
if(v.count(x)&&v[x] == 0){
return true;
}
删除:
v.erase();
multiset
和set相似,不过不会去重
初始化:
multiset<int>s;
当s.erase(x)时,会将s中所有的x都删除
当删除一个时,可用迭代器:
s.erade(s.find(x));
string

字符串转int:
string s = "123";
int a = stoi(s);
同理转long long:
long long a = stoll(s);
int转字符串:
int a = 123;
string s = to_string(a);
字符串拼接:
string s1 = "123";
s1 += "456";
则现在s1 = "123456";
把x放在s最后:s.push_back(x);
把从位置l到位置r的字符串替换为字符串z:
s.replace(l,r,z);
把字符串类型转为char的字符串类型:
s.c_str();
从pos开始找t,找不到返回string::npos:
s.find(t,pos);
从pos开始,截取长度为len的字串:
string t = s.substr(pos,len);
从pos开始截取到末尾:
string t = s.substr(pos);
浙公网安备 33010602011771号