在我的程序中,我需要检查是否已经在2.5*10^9的集合中生成了一个值。我希望生成该集合的大约一半的值,并且需要有一种快速的方法来检查和更新它。位集在我看来是一个好主意,因为它不需要太多内存(每个值1位),而且速度很快。
问题是,当我在我的类中定义我的set时,我得到了一个segmentation fault,因为它太大了(它适用于较小的尺寸)。
private:
std::bitset<2500000000UL> cover; // not working
std::bitset<25000UL> cover; // working有什么想法吗?
谢谢
PS:如果可能的话,我宁愿不使用外部库。我已经在使用GMP了,但我不认为他们有一个针对大数的位集合实现。
发布于 2011-04-25 23:47:28
这可能不是您的问题,但请尝试使用new在堆上分配位集,而不是使用堆栈。
有些系统会限制堆栈的大小,这可能会给您带来问题。
发布于 2020-04-04 19:38:59
我认为下面的解决方案比使用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];
}发布于 2021-04-04 02:56:48
它会导致分段错误,因为这里的内存是在堆栈而不是堆上分配的。堆栈上的内存分配非常有限,因此无法做到这一点。这就是动态内存分配的用武之地。如果你知道malloc是如何工作的,你可以修改代码,如下所示。
bitset<1000000000> *b;
b = (bitset<1000000000> *)malloc(sizeof(bitset<1000000000>));
b->set(0,1);完成位集后,使用delete关键字将其删除。
https://stackoverflow.com/questions/5780112
复制相似问题