我正在尝试在程序中使用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::array
或std::vector
。