在我的程序中,我需要检查是否已经在一组2.5 * 10 ^ 9中生成了一个值。我希望生成大约一半的集合,并需要快速检查和更新它。在我看来,bitset是一个好主意,因为它不需要太多内存(每个值1位)并且速度很快。
问题在于,当我在课堂上定义我的设置时,我得到一个segmentation fault
因为尺寸太大(适用于较小的尺寸)。
private:
std::bitset<2500000000UL> cover; // not working
std::bitset<25000UL> cover; // working
有什么想法吗?
谢谢
PS:如果可能,我宁愿不使用外部库。我已经在使用GMP,但我认为他们没有为大数字设置实现。
答案 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。