优先队列,bitset

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值