向量内存问题
c++ Vector memory problems
程序的内存应该是<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
- 如何针对特定情况调试和修复此双自由内存损坏问题
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 为什么瓦尔格林德在不释放恶意内存后没有报告任何问题?
- 包含矢量指针的结构的内存释放问题
- 在函数中分配内存时出现问题
- C++ 结构内部的unordered_map会导致内存泄漏问题吗?
- 使用 NTAllocateVirtualMemory 和 GetProcAddress 的内存分配问题不起作用
- 释放内存(主题模板)时出现问题
- C++ 中 std::vector 的内存问题
- C++ DLL 堆内存分配问题
- 在我的以下代码中获取 MLE(内存限制错误).尝试解决 ROUND C 2019(问题 A-摆动行走)启动问题
- 字符 * 未从重载运算符或内存管理问题正确返回
- delete[]有问题,如何部分删除内存
- 内存泄漏问题
- 指向动态内存中结构中的变量时出现问题
- c++中的内存管理问题
- C++堆栈内存管理问题
- 为什么我的C 代码在Linux上运行,而在Windows上不运行,是否有RAM内存的问题
- JNA 参数问题:内存访问无效
- boost的问题::内存映射~500MB,外部USB文件