gpt4 book ai didi

c++ - 在抛出 'std::bad_alloc' what(): std::bad_alloc 的实例后终止调用

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:56:46 28 4
gpt4 key购买 nike

我的程序中出现了 bad_alloc 异常。

这些是限制条件:

  • 1 <= T <= 10
  • 每个字符串的长度最多为 100000,并且只包含小写字符。

由于这些限制,我无法弄清楚为什么我的程序得到 bad_alloc

#include <string>
#include <algorithm>
#include <iostream>
#include <vector>

class SuffixArray {
std::vector<std::string> suffixes;
size_t N;
public:
SuffixArray(std::string& s) {
N = s.length();
suffixes.resize(N);
for (size_t i = 0; i < N; i++)
suffixes[i] = s.substr(i);
std::sort(suffixes.begin() , suffixes.end());
}
~SuffixArray() {
}
size_t lcp(std::string& s, std::string& t) {
size_t N = std::min(s.length(), t.length());
for (size_t i = 0; i < N; i++)
if (s[i] != t[i])
return i;
return N;
}
};

int main ( int argc, char **argv) {
int T;
std::cin >> T;
std::vector<size_t> results;

for ( int i = 0; i < T; i++) {
std::string str;
std::cin >> str;
SuffixArray sa(str);
size_t sol = 0;

for ( std::string::iterator it = str.begin(); it != str.end(); ++it) {
std::string target = std::string(it, str.end());
sol += sa.lcp(str, target);
}
results.push_back(sol);
}
for ( std::vector<size_t>::iterator it = results.begin(); it != results.end(); ++it)
std::cout << *it << std::endl;
results.clear();

return 0;
}

最佳答案

因为你在这里做了什么:

  for (size_t i = 0; i < N; i++)
suffixes[i] = s.substr(i);

是:创建N个长度为0,1,2,...,N的子串这些将消耗的内存总量是:1 + 2 + 3 + ... + N 字节。有了老高斯,你会发现前 N 个数字的总和是:N * (N + 1)/2

现在,如果您设置 N = 100,000,这将导致大约 5GB 的内存消耗 - 这大于最大值。除非您在 64 位系统上运行程序,否则您的程序通常拥有 2GB 地址空间。

编辑:我不知道您要解决的问题是什么,但是您的实现看起来很奇怪:

你永远不会使用计算后缀:你正在使用的 SuffixArray 的唯一函数是 lcp,它没有引用存储的 suffixes vector 。那么,您首先需要它们做什么?

关于c++ - 在抛出 'std::bad_alloc' what(): std::bad_alloc 的实例后终止调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8677238/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com