队列(queue)
#include<queue>
queue<int> q;
q.push(x);//在队尾加入x
q.pop();//队首元素出队
q.clear();//清空队列
q.empty();//判断队列是否为空
优先队列(priority_queue)
#include<queue>
priority_queue<int> q; //默认大根堆
priority_queue<int,vector<int>,greater<int> > q; //小根堆
priority_queue<int,vector<int>,less<int> > q; //大根堆
q.top() //堆顶元素,注意queue是q.front()
q.pop() //删除堆顶元素
q.push() //向堆中加入元素
q.empty() //堆是否为空
q.size() //堆的大小
动态数组(vector)
#include<vector>
vector<int> v1;
v1.push_back() //在数组的最后添加一个数据
v1.pop_back() //去掉数组的最后一个数据
v1.front() //返回第一个元素(栈顶元素)
v1.begin() //得到数组头的指针,用迭代器接受
v1.end() //得到数组的最后一个单元+1的指针,用迭代器接收
v1.clear() //移除容器中所有数据
v1.empty() //判断容器是否为空
v1.erase(pos) //删除pos位置的数据
v1.erase(beg,end) //删除[beg,end)区间的数据
v1.size() //回容器中实际数据的个数
v1.insert(pos,data) //在pos处插入数据
栈(stack)
#include<stack>
stack<int> st;
st.push(x); // 将x放入栈中
st.top(); // 获取栈顶元素
st.pop(); // 栈顶元素出栈
st.empty(); // 判断栈是否为空
二元组(pair)
#include<algorithm>
pair<int,int> p1;
p1=make_pair(1, 3);
p1.first //注意没有括号
p1.second
集合(set)
set本质为红黑树,支持一些基础平衡树操作
#include<set>
set<int> S;
set<int>::iterator it; //注意:set的迭代器只支持it++,it--,赋值,指针调用和判等
//如果想访问前驱、后继,只能直接移动it,而没有类指针的*(it+1)
//特别地,当set存pair时,(*it).first要注意括号,或者直接it->first
S.insert(v);
S.erase(it);
S.clear();
S.empty();
S.size();
S.count();
\\以下返回迭代器
S.begin();
S.end(); //注意S.end()不存东西,访问它是非法的
S.find(v); //找不到返回S.end()
S.lower_bound(v);
S.upper_bound(v);
迭代器使用细则
1、双向迭代器只支持前移,后移,赋值,指针调用和判等
set<int>::iterator it,it2;
++it; --it;
it2=it; (it2==it);
2、set的迭代器,map迭代器的键(it->first)是只读的(set维护区间时容易漏想)
3、检查迭代器是否为最后一个元素时,如果偷懒用(++it)==S.end()
,一定要记得移回来
set维护信息例题
键值对(map)
map的本质为红黑树,所有操作都是\(O(logn)\)
map构造键-值对应,对于map<key,value>来说,唯一的要求是key支持<号(用于平衡)
\(\textcolor{red}{*}\)注意:重载<号时一定要比较全部元素
map的判等条件为
!(a<b)&&!(b<a)
,因此如果部分比较,会导致未比较的关键信息被合并,导致错误
这样做可能会导致常数巨大,必要时可以用int替代
map的迭代器(iterator)可以指向两个值,it->first为key,it->second为value
#include<map>
map<key,value> mp;
map<ket,value>::iterator it;
mp.insert(make_pair(key,value)); //插入,如果此key已存在则插入失败
mp[key]=value; //赋值,可覆盖
mp.erase(value);
mp.count(key); //map中只有0/1
mp.clear();
mp.size();
//以下皆返回迭代器
mp.begin();
mp.end();
mp.find(value);
mp.lower_bound(); //待解决
mp.upper_bound(); //待解决
二分查找(lower_bound & upper_bound)
注意以下返回的都是指针
#include<algorithm>
upper_bound(a+1,a+n+1,k) //第一个大于k的位置
lower_bound(a+1,a+n+1,k) //第一个大于等于k的位置
bool cmp(int x,int k) { //自定义规则,注意k是给定参数,不是a[]的元素
return val[x]<=val[k];
}
lower_bound(a+1,a+n+1,k,cmp) //第一个不符合cmp的位置
upper_bound(a+1,a+n+1,k,cmp) //最后一个符合cmp的位置
math.h库
double x;
sin(x)
cos(x)
tan(x) //弧度制
log(x) //即ln(x)
exp(x) //e^x
double PI=acos(-1.0); //反余弦函数生成π
pow(x,y) //可用于实数指数的乘方运算
complex库
建议手写
bitset
即01数组,自带常数优化,为\(O(\frac 1 \omega)\)(\(\omega\)取决于系统位数)
支持下标操作,支持位运算,不支持四则运算,用法相当于bool数组+状压中表示\(S\)的int
#include<bitset>
bitset<64> bt;
//bitset只支持位运算,不支持四则运算
bt.count()
bt.flip() //全部反转
bt.to_ulong() //转成unsigned long
cout<<bt<<endl; //支持流输出
标签:map,set,迭代,STL,v1,mp,include
From: https://www.cnblogs.com/zhone-lb/p/18518373