You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 21:54:32