我正在用C ++编写一个算法,它将读取具有特定格式的数字的文件,然后正在读取的每个(数字减1)将是名为Amount
的数组中的位置,它将是inicreased by 1.文件格式如此
10 5
1 2 3 4 1 5 1 5 2 1
所有值都用空格分隔。第一行的前两个是变量N和M,第二行的值是将设置数组中将增加的位置的值。算法的一部分是:
int N,M,i;
FILE *read = fopen("data.in", "r");
fscanf(read, "%d %d ", &N, &M);
int Amount[M];
fill_n(Amount,M, 0);
for( i =0; i < N; i++)
{
fscanf(read, "%d ", &K);
Amount[K-1]++;
}
这个算法对于少量数字没有问题,但我需要它可以处理多达100万个数字,在这种情况下它会崩溃。我应该改变什么?
答案 0 :(得分:1)
程序崩溃是因为当M变为一百万个数字时,整数数组Ext.define('TestApp.Controllers.tbController', {
extend: 'Ext.app.ViewController',
singleton: true,
alias: 'controller.tbTemplate',
config:{stores: ['tbData'],},
requires: [
'TestApp.store.tbData'
],
windowOpened: function () {
console.log(Ext.getStore('tbData'));
}
});
无法分配足够的内存。
将内存分配到本地变量是来自堆栈部分,该部分是有限的(大约1 MB)。这意味着M只能取小于250000的值。
因此,更好的方法是使用new []来从堆部分分配内存。
stores: ['TestApp.store.tbData']
在退出程序之前,不要忘记在使用金额后使用Amount
取消分配/返回从堆分配的内存。
int *Amount = new int[M];
因此,在合并上述更改后,上面的代码如下所示:
delete[]