c ++矢量内存问题

时间:2016-11-05 11:38:30

标签: c++

我的程序的记忆应该是< 4-16 MB。我该如何优化它?我将简要解释一下我的程序的作用:

我在向量a中输入n,k和n数字。然后我在向量b中存储在向量a中找到的所有相等数的计数。因此,例如,如果向量a包含1,2,2,3,则向量B将存储如下计数:

1 -> 1
2 -> 2
3 -> 1 

然后我检查这些计数是否可被k整除,如果没有,我输出该数字并打破循环。我知道有些东西可以优化,但我该如何处理内存问题?这是下面的代码:

#include<iostream>
#include<vector>
using namespace std;
vector<int> a,b[1000001];
int main()
{
    int n,k;
    cin>>n>>k;
    for(int i=0; i<n; i++)
    {
        int k;
        cin>>k;
        a.push_back(k);
        b[a[i]].push_back(1);

    }
    for(int i=n-1; i>=0; i--)
    {
        if(b[a[i]].size() % k != 0)
        {

            cout<<a[i]<<"\n";

            break;

        }
    }
    return 0;
} 

2 个答案:

答案 0 :(得分:2)

不要使用b的向量,请使用std::map。你根本不需要a,只需阅读输入,找到b中的相应项并增加它

编辑:

首先,您不需要a,因为您可以在阅读时“动态”分析输入数字。

因此,任务归结为计算数字和存储结果。您需要存储一组对,其中一对是数字i以及它在输入中出现的次数。

您使用了一个数组。数组的问题在于它具有预定义的大小。你为什么用1000001?尝试输入大于1000001的数字,看看会发生什么?此外,1000001向量数组使用了大量内存,而大部分内容都被浪费,因为1,2,2,3的测试输入只会使用1000001个项目中的3个。

map在这里要好得多,因为它允许您将您的号码与其计数(发生的次数)相关联。所以map只包含3项测试输入项。 map看起来像是:

[key1, value1]
[key2, value2]
...

在您的情况下,key将是数字,value - 他们的数量。

要计算数字,您不需要为向量中的每个匹配项存储1,因为它的内存效率非常低(很多1 s)。您应该将它们计为c = c + 1++c

答案 1 :(得分:0)

此行vector<int> a, b[1000001]相当于:

vector<int> a
vector<int> b[1000001];

b的第二个数组vector<int>正在使用大量内存。

此行[{1}},您继续将b[a[i]].push_back(1)追加到向量b,这会不断增加它的大小。

您需要的是:

1

您阅读了有关矢量和地图的更多信息