C++:在计算大字符串的长度时抛出“std::bad_alloc”的实例后调用终止
Posted
技术标签:
【中文标题】C++:在计算大字符串的长度时抛出“std::bad_alloc”的实例后调用终止【英文标题】:C++ : terminate called after throwing an instance of 'std::bad_alloc' while computing length of big strings 【发布时间】:2017-03-26 14:25:08 【问题描述】:在下面的代码中,我试图计算输入字符串 s 中 a 的数量,将字符串(如果需要)重复到 n 个位置,其中 0
#include <string>
#include <iostream>
using namespace std;
int main()
string s;
cin >> s;
long n;
cin >> n;
long len = s.length();
long ans = 0;
if(n <= len)
for(long i = 0; i < n; i++)
if(s[i] == 'a')
ans++;
else
string comp = s;
while(comp.length() < n)
comp += s;
long diff = comp.length() - n;
if(diff > 0)
while (diff == 0)
comp.pop_back();
diff = comp.length() - n;
for(long i = 0; i < n; i++)
if(comp[i] == 'a')
ans++;
cout << ans << endl;
return 0;
【问题讨论】:
10^12
字节为 1 TB,猜猜为什么你会得到 std::bad_alloc
..
10^12
会使用大量的内存。除非您拥有像完全配置的 IBM 大型机之类的东西,否则不太可能有这么大的 RAM。
但我使用的是long
如果您要创建包含 TB 字符的字符串,则需要 TB 的 RAM。句号。该字符串在超空间中不存在。没有曲速驱动可以将弦带入其他维度。存储在字符串中的任何内容都会存储在实际内存中。此外,您希望通过以下方式完成什么:if(diff > 0) while (diff == 0)
。您实际上希望在哪种情况下执行 while 循环?您如何期望达到diff
大于 0,但随后神奇地变为等于 0 的情况?
鉴于您的描述,为什么所有这些代码都要做非常简单的事情? auto n = std::count(s.begin(), s.end(), 'a');
然后std::string test(n, 'a');
。即使考虑到内存分配的问题,也有很多代码可以用两到三行 C++ 来完成。
【参考方案1】:
10^12 是一个巨大的数字。即使每个项目占用 1 个字节,您也需要 1 TB 的内存。
让我们改变策略。查看下一个示例:
实例
对于 n = word.size(),这将返回 1。
如果 n = 2*word.size():
实例实例
这将返回 2:
对于 n = 3*word.size():
instanceinstance
这将返回 3:
看到这里的模式了吗?你可以用一个简单的乘法得到结果,剩下的用一个简单的循环:
std::string name;
std::cin >> name;
int n;
std::cin >> n;
int multiplier = std::count(name.begin(),name.end(),'a');
int full_iterations = n / name.size();
int last_iteration = n % name.size();
int ocurrences = multiplier * full_iterations * std::count(name.begin(),name.begin() + last_iteration,'a');
std::cout << ocurrences << std::endl;
std::count right here的文档
【讨论】:
以上是关于C++:在计算大字符串的长度时抛出“std::bad_alloc”的实例后调用终止的主要内容,如果未能解决你的问题,请参考以下文章