2017-11-13 8 views
0

私のプログラムでcopy_ifを使用しようとしています。私は3つの要素ごとに1つの配列の値を別の配列にコピーしたいと思います。copy_if in C++ ...問題あり

は基本的に、私はこのようなプログラムを書いた:

#include <iostream> 
#include <string> 
#include <algorithm> 

using namespace std; 

int main(int argc, char *argv[]) 
{ 
    int16_t *array; 
    int16_t *new_array; 

    array = new int16_t[10](); 
    new_array = new int16_t[4](); 

    array[0] = 9; 
    array[1] = 1; 
    array[2] = 50; 
    array[3] = 30; 
    array[4] = 3; 
    array[5] = 24; 
    array[6] = 66; 
    array[7] = 73; 
    array[8] = 108; 
    array[9] = 10; 

    copy_if(array, array+9, new_array, [&] (const int& i) -> bool 
    { size_t index = i -array[0]; return index % 3 == 0; }); 

    for (int jj = 0; jj < 4; jj++) { 
     cout << "new_array[" << jj << "] = " << new_array[jj] << endl; 
    } 
} 

最終結果は

new_array[0] = 9 
new_array[1] = 30 
new_array[2] = 66 
new_array[3] = 10 

ようにする必要がありますが、私は得る:

new_array[0] = 9 
new_array[1] = 30 
new_array[2] = 24 
new_array[3] = 66 

私は何回もcopy_ifを見ました私はポインタを使用しているので、私は何かが不足しているベクトルとproblayで使用されます。

+0

ベクターで同等のコードを試したときに何が起こりましたか? – juanchopanza

答えて

2

iは、それに対するポインタではありません。あなたの述語は間違っています。なぜなら配列要素の値に依存し、その位置は依存していないからです。

size_t index = &i - &array[0]; return index % 3 == 0; 

ここでは、ポインタ演算で位置を計算します。そのような述語は連続した記憶域に対してのみ機能することができます:C配列、std::arrayまたはstd::vector

+0

私はあなたのコードを試してみて、私にエラーを与えてコンパイルしません....型のinvialidオペランド...バイナリ演算子に。 Ok:2番目の、クリア:) – alexmark

+0

@alexmark - あなたの配列は 'int16_t'であり、オペランドは' const int& 'です。ここでタイプを修正してください。そのconst参照は、アルゴリズム内に変換と一時的な隠しがあることを意味します。 – StoryTeller

+0

ok ...私はあなたが私をehehehehと書いている間にそれをしました。できます。ありがとう – alexmark