priority_queue是一个优先队列,优先级高的最先出队,默认最大值优先。优先队列不支持删除堆中的指定元素,只可以删除堆顶元素,如果需要删除指定元素,则可以采用懒操作。使用priority_queue时,需要引入头文件#include<queue>
- push(x) x入队
- pop() 出队
- top() 取队头
- size() 返回队中的元素个数
- empty() 判断队空,若为空,则返回true
priority_queue<int> q1 //最大值优先队列
priority_queue<int,vector<int>,greater<int> > q2 //最小值优先队列
bitset是一个多位二进制数,如同状态压缩的二进制数。使用bitset时,需要引入头文件#include<bitset>。
bitset<1000>s 定义一个1000位的二进制数s
- 基本的位运算有:~(取反) &(与) |(或) ^(异或) >>(右移) <<(左移) ==(相等比较) !=(不相等比较)
- 可以直接对s[k]进行操作,注意最右侧为最低位第0位,左侧为高位。
成员函数如下:
- count() 统计有多少位是1
- any() 若至少有一位是1,返回true
- none() 若所有位为0,返回true
- set() 将所有位置1
- set(k) 将第k位置1
- set(k,val) 将第k位的值改为val,即s[k]=val
- reset() 将所有位置0
- reset(k) 将第k位置0
- flip() 将所有位取反
- flip(k) 将第k位取反
- size() 返回大小(位数)
- to_ulong() 返回它转化为unsigned long 的结果,如果超出范围,则报错。
- to_string() 返回它转化为string的结果
bitset的构造函数:
bitset<n> b; //b有n位,每位都为0
bitset<n> b(u); //b是unsigned long型u的一个副本
bitset<n> b(s); //b是string对象s中含有的位串的副本
bitset<n> b(s,pos,n); //b是s中从位置pos开始的n位的副本
1.用unsigned long 值作为bitset初始化对象时,该值将转化为二进制的位模式。若bitset长度大于二进制数,其余高位置0;如果bitset长度小于二进制数,则只使用unsigned值中的低阶位,超过bitset类型长度的高阶位将被抛弃。在32位unsigned long值的机器上,十六进制值0xffff表示位二进制位就是16个1和16个0(每个0xf都可被表示为1111)。
bitset<16> b1(0x3ffff); //0~15为置1
bitset<32> b1(0x3ffff); //0~15为置1,16~31位置0
bitset<128> b1(0x3ffff); //0~15为置1,16~31位置0,32~127位置0
可直接对bitset进行输出:
cout<<b<<endl;
2.用string对象初始化bitset对象
用string对象初始化bitset对象时,string对象直接被表示为位模式。从string对象读入位集的顺序时从右向左。
string s("1100");
bitset<32> b(s); //第2、3位为1,其余都为0
也可以只用某个子串作为初始值:
string s("1111111000000011001101");
bitset<32> b1(s,5,4); //从s[5]开始取4位,即1100
bitset<32> b2(s,s.size()-4); //取末尾4位,即1101
bitset上的操作
1.any/none。如果在bitset对象中有一个或多个二进制位被置为1,则any操作返回true,否则返回false;相反,如果bitset对象中的二进制位全为0,则none操作返回true
bitset<32> b; //32位,将所有位都置0
bool f=b.any(); //f为false
f=b.none(); //f为true
2.count/size。可以使用count统计二进制位为1的个数,size则返回对象中二进制位的个数。这两个操作返回值类型均为size_t。
size_t a=b.count();
size_t c=b.size();
3.set/test。
for(int i=0;i!=32;i+=2)
b[i]=1; //可以用下标操作某个二进制位
for(int i=0;i!=32;i+=2)
b.set(i); //也可以用set将偶数位置1
当测试某个二进制位是否为1时,有以下两种方法:
if(b.test(i))
if(b[i])
4.将十进制数转化为二进制数。
cout<<bitset<x>(y); //输出y转化为二进制后地数,共x位,不足补0,高位舍去
cout<<bitset<5>(12)<<endl; //输出01100