经典,我在这里寻找优化:我有一系列的东西,经过一些处理我知道我只对i到j的元素感兴趣。如何在fatset,最轻的方式中修剪我的数组,在i之前和之后完全删除/释放元素的内存?
我正在使用嵌入式C ++,所以我可能无法编译所有类型的库。但是std或者矢量事物在第一阶段受到欢迎!
我试过,要在i和j之间修剪数组A,用变量numElms告诉我A中元素的数量:
A = &A[i];
numElms = i-j+1;
因为这会产生不兼容错误。可以修复,即使修复了,它是否会为现在未使用的元素释放内存?
一个小上下文:这个数组是我模块的中心数据集,它可能很重。只要模块存在,它就会存在。并且不需要一直携带自重。这是完成的第一件事 - 确定数据集的哪个部分必须进行全部分析,并永远修剪和转储其余部分,永远不要再使用它(直到下一个循环,我们可能会得到一个新的数组)一个完全不同的大小)。
答案 0 :(得分:1)
在询问有关速度的问题时,您的掠夺可能非常基于您正在使用的阵列的大小,但是:
您的最快方式是不修剪数组,只需使用A[index + i]
找到您想要的元素。
最轻的方法是:
malloc
i
和j
后,将该范围复制到动态数组的头部realloc
将动态数组的大小调整为j - i + 1
但是你把它标记为C ++而不是C,所以我相信你也对可读性和所需的编程投资感兴趣,而不是原始速度或重量。如果是这样,那么我建议使用vector
或deque
。
您可以执行vector<thing> A
或deque<thing> A
:
A.erase(cbegin(A), next(cbegin(A), i));
A.resize(j - i + 1);
答案 1 :(得分:0)
在标准C ++中无法更改已分配的内存块大小(除非您有POD数据 - 在这种情况下可以使用像realloc
这样的C设施)。修剪数组的唯一方法是分配新数组。复制/移动所需元素并销毁旧数组。
您可以手动或使用矢量:
int* array = new int[10]{0,1,2,3,4,5,6,7,8,9};
std::vector<int> vec {0,1,2,3,4,5,6,7,8,9};
//We want only elements 3-5
{
int* new_array = new int[3];
std::copy(array + 3, array + 6, new_array);
delete[] array;
array = new_array;
}
vec = std::vector<int>(vec.begin()+3, vec.begin()+6);
如果您使用的是C ++ 11,则两种方法都应具有相同的性能。
如果您只想删除额外的元素并且不想释放内存(例如,您可能希望稍后添加更多元素),则可以关注NathanOliver link
但是,你应该考虑:你真的需要释放的内存吗?你现在需要移动元素吗?你会在这么长的时间内活动,你的程序会完全丢失这个内存吗?也许你需要一个range
或者为数组内容提供一个view
?在许多情况下,您可以存储两个指针(或指针和大小)来表示您的&#34; new&#34;数组,同时保持旧的一次被释放。