我正在尝试在程序中使用copy_if。我想将每3个元素的一个数组的值复制到另一个数组中。

基本上,我写了一个像这样的程序:

#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


我见过很多与vector一起使用的copy_if,但是由于我使用了指针,所以可能丢失了某些东西。

最佳答案

i是元素,而不是指向它的指针。您的谓词是错误的,因为它依赖于数组元素的值,而不是它们的位置。它应该是:

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


现在,它使用指针算法计算位置。请记住,这样的谓词只能用于连续存储:C数组,std::arraystd::vector

09-06 21:52