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

将vector<bool>代码转为bitset后无法运行,问题出在哪?

bitset实现失效的问题分析

我在HackerRank解决一道问题时,写出了可行的vector<bool>解决方案:

#include <iostream>
#include <vector>
using namespace std;
int main() {
    constexpr size_t BIG = 1u<<31;
    vector<bool> arr(BIG);
    size_t N,S,P,Q;
    cin >> N >> S >> P >> Q;
    size_t prev = S % BIG;
    arr.at(prev) = true;
    int count = 0;
    while (N--) {
        size_t curr = (prev*P+Q)% BIG;
        if(!arr.at(curr))
        {
            arr.at(curr) = true;
            ++count;
        }
        prev = curr;
    }
    cout << count;
}

但改用bitset实现相同逻辑时,代码无法正常运行,请问问题出在哪里?

#include <iostream>
#include <bitset>
using namespace std;
int main() {
    constexpr size_t BIG = 1u<<31;
    bitset<BIG> arr;
    size_t N, S, P, Q;
    cin >> N >> S >> P >> Q;
    size_t prev = S % BIG;
    arr.set(prev);
    while (N--) {
        size_t curr = (prev*P+Q)% BIG;
        arr.set(curr); prev = curr;
    }
    cout << arr.count();
}

核心问题

1. 栈溢出导致程序崩溃

std::bitset的大小是编译期固定的,它的内存直接分配在栈上。1u<<31位等于256MB,远超过绝大多数编程竞赛环境的栈内存限制(通常仅8~16MB),直接触发栈溢出,程序无法正常启动或运行中崩溃。

而std::vector<bool>是在堆上动态分配内存,堆的可用空间远大于栈,所以能正常容纳这个量级的内存需求。

2. 计数逻辑不一致

原vector<bool>代码中,count仅统计循环过程中新增的不重复元素,初始的prev元素并未计入(count从0开始,只有首次标记新元素时递增);但bitset::count()会统计所有被设置为true的位,包括初始的prev,这会导致最终输出结果比正确值多1(若初始元素未重复)。


内容的提问来源于stack exchange,提问作者Aboody Essam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 01:15:32