2016-06-09 72 views
1

經典的,我在這裏尋找優化:我有一些東西,經過一些處理後,我知道我只對j到j的元素感興趣。如何用胖子最輕的方式修剪我的數組,並在j之前和之後完全刪除/釋放元素內存?修剪陣列到i和j之間的元素

我正在做嵌入式C++,所以我可能無法編譯各種庫讓我們說。但在第一階段歡迎std或向量的東西!

我嘗試過,對於陣列A至i和j之間進行修整,具有可變numElms告訴我元素的數量在一個:

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

由於它是這會產生一個不兼容錯誤。這可以修復嗎?即使修復了,現在也可以釋放內存 - 未使用的內存?

上下文:這個數組是我的模塊的中心數據集,它可能很重。只要模塊存在,它就會存活。這段時間沒有必要承擔自重。這是完成的第一件事 - 確定要分析哪一部分數據集,並永遠修剪和拋棄其餘部分,永遠不要再使用它(直到下一個週期,我們可能會得到一個新的數組)完全不同的尺寸)。

+0

是在原始陣列中的數據或者是在容器像一個向量? – NathanOliver

+0

現在它是一個更復雜的對象數組,但如果它意味着更容易修剪和其他處理,我願意更改爲容器 –

+0

嗯,矢量應該與原始數組一樣易於使用。它還可以通過編寫2行代碼來實現您想要的功能。如果這樣的作品,那麼你想要的是在這裏覆蓋:http://stackoverflow.com/questions/37575163/how-to-slice-a-vector-in-c-and-assign-to-itself – NathanOliver

回答

1

當問速度問題,您millage很可能根據您正在使用的數組的大小,而是:

最快方式將是修剪陣列,只需使用A[index + i]找到你想要的元素。

最輕的方式做這將是:

  1. 分配與malloc
  2. 一旦ij動態數組中找到副本範圍的動態數組的頭
  3. 使用realloc將動態數組的大小調整爲大小j - i + 1

但是,您已將此標記爲C++不是C,所以我相信您對可讀性和所需的編程投資感興趣,而不是原始的速度或重量。如果這是真的,那麼我會建議使用vectordeque

鑑於vector<thing> Adeque<thing> A你可以這樣做:

A.erase(cbegin(A), next(cbegin(A), i)); 
A.resize(j - i + 1); 
+0

非常好的答案,1)+1爲「不修剪」,並傳遞一個參數說明從哪裏開始/結束2)+2僅用於在開始時移動頭部 –

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或perharps view到數組內容?在許多情況下,您可以存儲兩個指針(或指針和大小)來表示您的「新」數組,同時保留舊數組一次全部釋放。

+0

GAH! **不要做這個**你刪除[]數組;然後使用它。那太糟糕了。幸運的是,通過循環第二次,這將會出錯。我只能認爲你打算在'for'循環之後有'delete [] array' *。在任何情況下,這都要求您在循環期間保持'array' *和*'new_array'的打開狀態。取決於'new_array'的大小,這可能不可行。這是爲什麼[在我的答案](http://stackoverflow.com/a/37725961/2642059)我建議你使用'vector' /'deque'來包含你的初始數組,然後調整大小以適應範圍。 –

+1

@JonathanMee你有沒有可能讀過第一篇文章,我錯誤地把大括號放在了哪裏?現在沒有任何循環。 –

相關問題