在C ++中定义一个大的bitset

时间:2011-04-25 15:44:51

标签: c++ bitset

在我的程序中,我需要检查是否已经在一组2.5 * 10 ^ 9中生成了一个值。我希望生成大约一半的集合,并需要快速检查和更新它。在我看来,bitset是一个好主意,因为它不需要太多内存(每个值1位)并且速度很快。

问题在于,当我在课堂上定义我的设置时,我得到一个segmentation fault因为尺寸太大(适用于较小的尺寸)。

private:
  std::bitset<2500000000UL> cover; // not working
  std::bitset<25000UL> cover; // working

有什么想法吗?

谢谢

PS:如果可能,我宁愿不使用外部库。我已经在使用GMP,但我认为他们没有为大数字设置实现。

4 个答案:

答案 0 :(得分:17)

这可能不是你的问题,但尝试用new分配堆上的bitset,而不是使用堆栈。

某些系统会限制堆栈的大小,这可能会导致问题。

答案 1 :(得分:1)

我认为以下解决方案比使用new

    std::vector<std::bitset<2500000000UL>> wrapper(1);
    auto & cover = wrapper[0];//To avoide unnecessary indirection by wrapper[0]

演示

int main(){
    std::vector<std::bitset<2500000000UL>> wrapper(1);
    auto & cover = wrapper[0];
    cover[0] = 1;
    std::cout << cover[0] << " " << cover[2500000000UL - 1];
}

答案 2 :(得分:0)

它会导致分段错误,因为这里的内存是在堆栈上而不是堆上分配的。堆栈上的内存分配非常有限,因此无法这样做。 这是动态内存分配派上用场的时候。如果您了解 malloc 的工作原理,则可以按如下方式修改您的代码。

bitset<1000000000> *b;
b = (bitset<1000000000> *)malloc(sizeof(bitset<1000000000>));
b->set(0,1);

完成位集后,使用 delete 关键字将其删除。

答案 3 :(得分:-1)

对于大尺寸,使用std :: vector而不是std :: bitset。