将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
相关产品推荐
相关产品推荐

