I am getting the following error: terminate called after throwing an instance of 'std::bad_alloc'

I am getting the following error: terminate called after throwing an instance of 'std::bad_alloc'

好的,我有一个重复 n 次的字符串 s。例如,我有 "aba" 和 n = 10,我想找到 a的数量。所以在这种情况下 (abaabaabaa) 我们有 7 个 a。我写了下面的代码,通过了一些测试用例,但是当 n 很大时,我得到了错误: 在抛出 'std::bad_alloc 的实例后调用终止。 有办法解决吗?谢谢

long repeatedString(string s, long n) {

    long i = 0, j = 0, cnt = 0;
    long sz = s.size();
    vector<char> ar;

    while (i < n)
    {
        ar.push_back(s[j]);
        j++;

        if (j >= sz)
        {
            j = 0;
        }

        i++;
    }

    i = 0;
    while (i < n)
    {
        if (ar[i] == 'a')
        {
            cnt++;
        }
        i++;
    }

    return cnt;

}

基本上,原因是您 运行 内存不足。当您执行 push_back 时,向量可能会重新分配,这将需要 capacity + capacity * 2(乘数可能会有所不同)的连续分配量 space。如果您提前保留,这将解决该问题,但您仍然需要 n 个连续字节的内存。

更好的解决方案是只读取字符串并进行一些乘法运算,如下所示:

size_t repeatedString( const std::string &s, size_t n ) {
    size_t sz = s.size();
    size_t cnt = 0;

    for ( const char &c : s ) {
        if ( c == 'a' ) {
            ++cnt;
        }
    }

    size_t mult = n / sz;
    cnt *= mult;
    size_t rem = n % sz;

    for ( size_t idx = 0; idx < rem; ++idx ) {
        if ( s[idx] == 'a' ) {
            ++cnt;
        }
    }

    return cnt;
}

这使得您不需要分配额外的 n 字节,因此减少了内存。