1.bitset的介绍
类模板 bitset 表示一个 N 位的固定大小序列。可以用标准逻辑运算符操作 bitset,并将它与字符串和整数相互转换。对于字符串表示和移位操作的列举方向来说,这个序列被当做最低索引元素位于右侧,类似于整数的二进制表示。这个类提供了一些方便的方法来操作位,例如设置、重置、翻转位等。bitset也叫位图
1.1bitset的创建
std::bitset<N> bitset1; // 创建一个长度为 N 的 bitset,所有位都被初始化为 0
std::bitset<N> bitset2(value); // 使用二进制整数 value 初始化一个长度为 N 的 bitset
std::bitset<32> bitset21(0xffff); // bits 0 ... 15 are set to 1; 16 ... 31 are 0
std::bitset<128> bitset22(0xffff); // bits 32 through 127 initialized to zero
std::bitset<N> bitset3(string); // 使用二进制字符串 string 初始化一个长度为 N 的 bitset
string str("1111111000000011001101");
std::bitset<N> bitset31(str); //用整个字符串来初始化bitset
std::bitset<32> bitset32(str, 5, 4); // 4 bits starting at str[5], 1100
std::bitset<32> bitset33(str, str.size() - 4); // use last 4 characters
std::bitset<N> bitset4(bitset); // 使用另一个 bitset 初始化一个长度为 N 的 bitset
std::bitset<n> bitset5(bitset4, pos, n); //bitset5是bitset4中从位置pos开始的n个位的副本
1.2.bitset的操作
bitset有许多函数,bitset在头文件<bitset>中
#include<iostream>
#include<bitset>
using namespace std;
int main(){
bitset<20> bt;
bt[0]=1;
cout<<bt<<endl;
cout<<sizeof bt<<endl;
cout<<bt.count()<<endl; //计算bt里面有多少 1
cout<<bt.set(4)<<endl; //bt在pos处的二进制置为 1
cout<<bt.reset()<<endl; //bt所有二进制位都置为 0
bt.flip(); //bt中所有二进制位逐位取反
cout<<bt.none()<<endl; //bt中是否有 1在里面,是为 1,没有为 0
cout<<bt.any()<endl; //判断bt内是否有数据,有为 1,没有为 0
cout<<bt.test(4)<<endl; //判断当前位置是否为 1
}
#include<bits/stdc++.h>
using namespace std;
int main(){
bitset<20> bt(1234);
cout<<bt<<endl; //bitset 里面只有 0或 1,为 1234的二进制表示
string s="1010001";
bitset<10> bi(s);
cout<<bi<<endl; //如果是字符串格式,则直接存入
cout<<bi.to_ulong()<<endl; //将bi中二进制转化为十进制
//转化为 unsigned long
cout<<bt.to_string()<<endl; //以二进制打印
// bitset之间是不能进行大小比较的,只能进行相等和不相等的的比较
}
1.3.bitset运算符的使用
int main()
{
//>>输入、<<输出运算符
bitset<8> bs;
cin >> bs;//10100
cout << bs << endl;//00010100
//复合赋值运算符
bitset<8> bs1("101011");
bitset<8> bs2("100100");
cout << (bs1 >>= 2) << endl;//00001010
cout << (bs2 |= bs1) << endl;//00101110
//位运算符
bitset<8> bs3("10010");
bitset<8> bs4("11001");
cout << (bs3 & bs4) << endl;//00010000
cout << (bs3 ^ bs4) << endl;//00001011
//operator[]运算符
cout << bs3[4] << endl;//1
cout << bs3[2] << endl;//0
}
2.STL中set的介绍
set就是集合,STL的set用二叉树实现,集合中的每个元素只出现一次,里面的元素是唯一的(参照数学中集合的互斥性),并且是排好序的(默认按键值升序排列),访问元素的时间复杂度是O(log以2为底,n的对数)
不能直接修改容器中元素的值,必须先删除原有的元素,再插入新元素
set在头文件<set>中,set具有迭代器set<int>::iterator i
;
set<int> q; //以int型为例 默认按键值升序
set<int,greater<int>> p; //降序排列
int x;
q.insert(x); //将x插入q中
q.erase(x); //删除q中的x元素,返回0或1,0表示set中不存在x
q.clear(); //清空q
q.empty(); //判断q是否为空,若是返回1,否则返回0
q.size(); //返回q中元素的个数
q.find(x); //在q中查找x,返回x的迭代器,若x不存在,则返回指向q尾部的迭代器即 q.end()
q.lower_bound(x); //返回一个迭代器,指向第一个键值不小于x的元素
q.upper_bound(x); //返回一个迭代器,指向第一个键值大于x的元素
q.rend(); //返回第一个元素的的前一个元素迭代器
q.begin(); //返回指向q中第一个元素的迭代器
q.end(); //返回指向q最后一个元素下一个位置的迭代器
q.rbegin(); //返回最后一个元素
q.swap(p) //交换q和p的内容