C++98下bitset::test抛出std::out_of_range异常如何解决
报错原因与修复方案
std::out_of_range异常由bitset::test/bitset::set触发的唯一原因是:传入的索引值为负数,或者大于等于bitset的声明长度。
你贴出的代码逻辑里rand()%270理论上只会生成0~269的整数,正好匹配std::bitset<270>的合法索引区间(0到长度-1),出现越界基本是三个问题导致的:
- 缺失必要头文件:没有包含
<cstdlib>时,编译器会对rand()做隐式函数声明,默认其返回值为int,在部分老版本编译器中会导致返回值异常,生成超出0~269范围的数值,触发越界。 - 非标准的main函数定义:标准C++要求
main返回值必须为int,写void main()属于编译器扩展的非标准写法,部分环境下会生成异常代码导致变量值错乱。 - 无边界校验逻辑:原参考代码没有对入参做范围检查,只要任意一次传入的
parameter超出合法区间就会直接抛错。
修复后可直接运行的代码
#include <iostream> #include <bitset> #include <cstdlib> #include <ctime> // 把bitset长度定义为常量,后续修改范围时不需要改多处逻辑 constexpr int VALUE_RANGE = 270; std::bitset<VALUE_RANGE> mem; void getValue(int parameter) { // 新增边界校验,从根源避免越界 if (parameter < 0 || parameter >= VALUE_RANGE) { return; } if (!mem.test(parameter)) { mem.set(parameter); std::cout << parameter << std::endl; } } int main() { // 可选:设置随机数种子,否则每次运行生成的随机数序列完全一致 std::srand(static_cast<unsigned int>(std::time(nullptr))); int parameter = 0; std::cout << "Random numbers :" << "\n"; for(int i = 0; i < VALUE_RANGE; i++) { parameter = rand() % VALUE_RANGE; std::cout << "parameter=" << parameter << "\n"; getValue(parameter); } return 0; }
扩展适配方案
如果你后续需要处理的parameter取值范围不固定、可能出现负数或者数值远大于270,bitset就不再适用,可以换成std::unordered_set做去重,不需要提前限定取值范围:
#include <iostream> #include <unordered_set> std::unordered_set<int> mem; void getValue(int parameter) { if (!mem.count(parameter)) { mem.insert(parameter); std::cout << parameter << std::endl; } }
内容的提问来源于stack exchange,提问作者frincit
相关产品推荐
相关产品推荐

