2

C++ 配列のデータ操作で別の問題が発生しています。配列からすべてのゼロを削除して、配列を間引きたいと思います。

だから例えば私が持っていた前に言うと にarray[4] = {1,2,0,0,4}なるでしょうarray[3] = {1,2,4}

メインデータを格納する配列を反復処理するために for ループを使用する必要があること、およびデシメートされたデータを格納するために新しい配列を初期化する必要がある可能性が高いことはわかっていますが、その方法がよくわかりません。

4

4 に答える 4

3

配列の内容がわからない場合、ゼロ以外の値がいくつになるかがわからないため、メモリを動的に割り当てる必要があります。を使用しstd::vectorます。

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

最初に avectorから始める場合は、erase-remove を使用してその場でデータを操作できます。

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; });

すべての入力を知っていない限り、ここで固定サイズの配列に到達する解決策は実際にはありません。

于 2012-07-20T15:11:04.550 に答える
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;

満足している場合は、回答済みの質問にマークを付けてください。

于 2012-07-27T16:19:14.703 に答える