STL

队列(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维护信息例题

P5226
$\ $ P1081

键值对(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

link

#include<bitset>
bitset<64> bt;
//bitset只支持位运算,不支持四则运算
bt.count()
bt.flip()	//全部反转
bt.to_ulong()	//转成unsigned long
cout<<bt<<endl;	//支持流输出
posted @ 2024-10-31 17:15  Zhone_lb  阅读(8)  评论(0)    收藏  举报