我在處理C++數組中的數據時遇到了另一個問題。我現在想通過從數組中刪除所有的零來對數組進行抽取。從數組中刪除零並將數組大小調整爲新的元素數量?
因此,例如說之前我有array[4] = {1,2,0,0,4}
它會變成array[3] = {1,2,4}
。
我知道我需要使用for循環遍歷存儲主數據的數組,並且我很可能需要初始化一個新數組來存儲抽取的數據,但我不太清楚如何去關於它。
我在處理C++數組中的數據時遇到了另一個問題。我現在想通過從數組中刪除所有的零來對數組進行抽取。從數組中刪除零並將數組大小調整爲新的元素數量?
因此,例如說之前我有array[4] = {1,2,0,0,4}
它會變成array[3] = {1,2,4}
。
我知道我需要使用for循環遍歷存儲主數據的數組,並且我很可能需要初始化一個新數組來存儲抽取的數據,但我不太清楚如何去關於它。
如果你不得不調整數組的大小,爲什麼不簡單地使用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;
}
我想如果他甚至不知道如何編寫for循環它可能是有點超過頂部混合載體:) – 2012-07-20 15:11:31
這就是爲什麼我沒有混合lambdas :) – 2012-07-20 15:13:27
我不熟悉函數你是在那裏打電話的。你能向我解釋它在做什麼以及這段代碼如何工作?目前,我不知道如何實現這一點的代碼來刪除我的數組中的零。 – 2012-07-20 15:15:17
如果你不知道數組的內容,你可以不知道許多 值怎麼會不爲零,所以你的內存必須是動態分配的 。使用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; });
實在是沒有辦法在固定大小的數組來到這裏,除非你知道你所有的投入。
由於靜態分配,您無法調整普通數組的大小。因此,使用標準庫(STL)中的vector
可能會更好。用這種方法你不需要創建一個新的數組。實際上,除非有很強的理由,否則使用std::vector
或std::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中的例子)的能力。這可能會導致內存節省(尤其是在矢量中有很多元素的情況下)。
嚴格來說,OP需要一個數組而不是std :: vector。 – Vlad 2012-07-20 15:15:20
我認爲零將移動到最後......如何縮小以適應幫助? – 2012-07-20 15:15:34
@parapurarajkumar你說得對,我解決了這個問題。謝謝! – betabandido 2012-07-20 15:17:49
假設您有一個數組,並且想要刪除數組中的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;
隨意標記回答如果你滿意的問題。
數組的大小是其類型的一部分,並且不能修改對象的類型。因此數組永遠不能調整大小。您可以創建一個不同大小的新數組並複製元素。 – bames53 2012-07-20 15:44:46