2012-07-20 17 views
1

我在處理C++數組中的數據時遇到了另一個問題。我現在想通過從數組中刪除所有的零來對數組進行抽取。從數組中刪除零並將數組大小調整爲新的元素數量?

因此,例如說之前我有array[4] = {1,2,0,0,4}它會變成array[3] = {1,2,4}

我知道我需要使用for循環遍歷存儲主數據的數組,並且我很可能需要初始化一個新數組來存儲抽取的數據,但我不太清楚如何去關於它。

+0

數組的大小是其類型的一部分,並且不能修改對象的類型。因此數組永遠不能調整大小。您可以創建一個不同大小的新數組並複製元素。 – bames53 2012-07-20 15:44:46

回答

2

如果你不得不調整數組的大小,爲什麼不簡單地使用std :: vector。這個例子就是這樣。

#include <vector> 
#include <algorithm> 

bool isZero (int i) 
{ 
    return i == 0; 
} 

int main() 
{ 

    std::vector<int> myarray; 

    myarray.push_back(0); 
    myarray.push_back(1); 
    myarray.push_back(0); 
    myarray.push_back(3); 
    myarray.push_back(9); 

    std::vector<int>::iterator newIter = std::remove_if(myarray.begin() , myarray.end() , isZero); 
    myarray.resize(newIter - myarray.begin()); 

    return 0; 
} 
+0

我想如果他甚至不知道如何編寫for循環它可能是有點超過頂部混合載體:) – 2012-07-20 15:11:31

+0

這就是爲什麼我沒有混合lambdas :) – 2012-07-20 15:13:27

+0

我不熟悉函數你是在那裏打電話的。你能向我解釋它在做什麼以及這段代碼如何工作?目前,我不知道如何實現這一點的代碼來刪除我的數組中的零。 – 2012-07-20 15:15:17

2

如果你不知道數組的內容,你可以不知道許多 值怎麼會不爲零,所以你的內存必須是動態分配的 。使用std::vector

std::vector<int> v; 
std::copy_if(begin(array), end(array), std::back_inserter(v), 
      [](int x) { return x != 0; }); 

如果你要做一個vector開始下手,你可以操縱的就地擦除刪除數據。

v.erase(std::remove(begin(v), end(v), 0), end(v)); 

如果你真的想這樣做艱難地:

// count 
auto non_zero_count = std::count_if(begin(array), end(array), 
            [](int x) { return x != 0;}); 
// allocate 
int* new_array{new int[x]}; 
std::copy_if(begin(array), end(array), new_array, 
      [](int x) { return x != 0; }); 

實在是沒有辦法在固定大小的數組來到這裏,除非你知道你所有的投入。

7

由於靜態分配,您無法調整普通數組的大小。因此,使用標準庫(STL)中的vector可能會更好。用這種方法你不需要創建一個新的數組。實際上,除非有很強的理由,否則使用std::vectorstd::array(在C++ 11中)通常比純C類型的數組更好。

使用vector,你可以這樣做:

std::vector<int> v{1,2,0,0,4}; 
v.erase(
    std::remove(v.begin(), v.end(), 0), 
    v.end()); 

擦除零種元素後,向量仍然有能力爲5,但(當然v.size()將返回3,如預期)。如果可以使用C++ 11然後可以去一點點進一步:

v.shrink_to_fit(); 

shrink_to_fit呼叫降低矢量的給它適應元件在它的實際數目(3中的例子)的能力。這可能會導致內存節省(尤其是在矢量中有很多元素的情況下)。

+0

嚴格來說,OP需要一個數組而不是std :: vector。 – Vlad 2012-07-20 15:15:20

+1

我認爲零將移動到最後......如何縮小以適應幫助? – 2012-07-20 15:15:34

+0

@parapurarajkumar你說得對,我解決了這個問題。謝謝! – betabandido 2012-07-20 15:17:49

0

假設您有一個數組,並且想要刪除數組中的0值並調整其大小。

int toResize[] = {4,3,2,0,8,7,9,0,5,4,7,0}; //12 elements 
vector<int>resized; 
vector<int>::iterator it; 
for(int i=0;i<12;i++){ 
int check = toResize[i]; 
    if(check!=0){ 
    resized.push_back(check); 
    } 
} 

for (it=resized.begin() ; it < resized.end(); it++) 
cout << " " << *it; 

隨意標記回答如果你滿意的問題。