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

Define a large bitset in C++

本文关键字:一个 bitset c++ 定义      更新时间:2023-10-16

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

问题是,当我在我的类中定义我的集合时,我得到了一个segmentation fault,因为大小太大(它适用于较小的尺寸)。

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

你知道吗?

谢谢

PS:如果可能的话,我宁愿不使用外部库。我已经在使用GMP了,但我不认为他们对大数字有一点固定的实施。

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

有些系统限制堆栈的大小,这可能是导致问题的原因。

我认为下面的解决方案比使用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];
}

这将导致分段错误,因为这里的内存是在堆栈而不是堆上分配的。堆栈上的内存分配非常有限,因此它无法这样做。这时就需要动态内存分配了。如果你知道malloc是如何工作的,你可以这样修改你的代码:

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

完成bitset后,使用delete关键字删除它。

使用std::vector代替std::bitset。