修剪数组到i和j之间的元素

时间:2016-06-09 11:52:50

标签: c++ arrays memory-leaks trim

经典,我在这里寻找优化:我有一系列的东西,经过一些处理我知道我只对i到j的元素感兴趣。如何在fatset,最轻的方式中修剪我的数组,在i之前和之后完全删除/释放元素的内存?

我正在使用嵌入式C ++,所以我可能无法编译所有类型的库。但是std或者矢量事物在第一阶段受到欢迎!

我试过,要在i和j之间修剪数组A,用变量numElms告诉我A中元素的数量:

A = &A[i];
numElms = i-j+1;

因为这会产生不兼容错误。可以修复,即使修复了,它是否会为现在未使用的元素释放内存?

一个小上下文:这个数组是我模块的中心数据集,它可能很重。只要模块存在,它就会存在。并且不需要一直携带自重。这是完成的第一件事 - 确定数据集的哪个部分必须进行全部分析,并永远修剪和转储其余部分,永远不要再使用它(直到下一个循环,我们可能会得到一个新的数组)一个完全不同的大小)。

2 个答案:

答案 0 :(得分:1)

在询问有关速度的问题时,您的掠夺可能非常基于您正在使用的阵列的大小,但是:

您的最快方式是修剪数组,只需使用A[index + i]找到您想要的元素。

最轻的方法是:

  1. 使用malloc
  2. 分配动态数组
  3. 找到ij后,将该范围复制到动态数组的头部
  4. 使用realloc将动态数组的大小调整为j - i + 1
  5. 但是你把它标记为C ++而不是C,所以我相信你也对可读性和所需的编程投资感兴趣,而不是原始速度或重量。如果是这样,那么我建议使用vectordeque

    您可以执行vector<thing> Adeque<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;数组,同时保持旧的一次被释放。