在c++中定义一个大的bitset
Define a large bitset in C++
在我的程序中,我需要检查我是否已经在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。
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 运行同一解决方案的另一个项目的项目
- 挂起和取消挂起一个文件DLL
- 用C++中的一个变量定义一个常量
- 函数向量_指针有不同的原型,我可以构建一个吗
- 在c++中用vector填充一个简单的动态数组
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 预处理器:插入结构名称中的前一个行号
- 我在c++代码中生成了一个运行时#3异常
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 对于std::bitset,是否有一个ffs()等价物
- 如何从二进制字符串创建一个bitset
- 将两个8位的bitset赋值给一个16位的bitset
- 使用std::bitset实现一个二进制计数器
- 如何为bitset编写一个类似make_pair的函数
- 在标准c++中创建一个动态bitset
- 在c++中定义一个大的bitset
- 如何创建一个Bitset数组队列