template <size_t N> class bitset;
1、同数组一样,N为bitset的类型的一部分,N必须为编译时常量。
2、同数组一样,N一旦确定后就不能修改。
3、当用bitset进行大量数据处理时,注意变量声明的位置。如:
在内存1G的情况下,给定一个最多包含40亿个随机排列的32位整数的顺序文件,找出一个不在文件中的32位整数。
这时就可以考虑用bit来代替int数据。即分配一个40亿bit长度大空间,如果包含数A,则将该空间的第A位设置为1。如:第文件包含数12435,则将第12435个bit设置为1;若不包含,则设置为0;这样原本需要40*4=160亿Byte (16G)的空间就被压缩到了40亿/8=5亿Byte(500M)的空间里。
stl中有两个现成的模板可以使用。vector<bool>和bitset。两个模板都是使用位(bit)来存储的。
若要使用bitset解决上面的问题,一定不能将bitset声明为局部变量!!!!!
看下面的代码:
int main()
{
bitset<4000000000> myset;
// ........
}
这段代码看似没什么问题,但可以肯定,它无法运行。因为bitset声明为了局部变量,那就意味着该变量的空间要在栈上分配。500M的空间足以导致栈溢出!!!!
解决方法有两种:
①将myset声明为全局变量。
②将myset声明为指针,然后用new动态分配空间。