向量内存问题

c++ Vector memory problems

本文关键字:问题 内存 向量      更新时间:2023-10-16

程序的内存应该是<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;
} 

不使用向量表示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),你应该像c = c + 1++c一样计数它们。

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

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

vector<int>的第二个数组b占用了大量内存。

还有这行b[a[i]].push_back(1),你一直把1附加到向量b上,这将继续增加它的大小。

你需要的是:

int main()
{
    std::map<int, int> m;
    int n,k;
    cin >> n >> k;
    for(int i=0; i<n; i++) {
        int k;
        cin >> k;
        m[k]++;
    }
    for(auto it = m.begin(); it != m.end(); it++) {
        if (it->second % k == 0) {
            cout << it->first << "n";
        }
    }
}

你阅读了更多关于vector和map的内容

  • http://en.cppreference.com/w/cpp/container/vector
  • http://en.cppreference.com/w/cpp/container/map