我的问题/疑虑是关于std::transform()
中使用的函数参数。
在下面的代码中,如果我在平方函数的整数参数i
中使用“pass-by-reference”(即int squared(int i))
,则它不会编译。
我必须将其更改为按值传递,以便进行编译。任何人都可以告诉我为什么以及这是否是使用std::transform()
?
std::for_each()
可以使用“按值传递”和“按引用传递”方法(如print()
所示)。
提前致谢。
#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
int squared(int i);
void print(int &i);
int main()
{
std::vector<int> intVec;
std::vector<int> newIntVec;
for (int i = 0; i < 10; ++i)
intVec.push_back(i);
std::for_each(intVec.begin(), intVec.end(), print);
std::cout << std::endl;
std::transform(intVec.begin(), intVec.end(), std::back_inserter(newIntVec), squared);
std::for_each(newIntVec.begin(), newIntVec.end(), print);
std::cout << std::endl;
return 0;
}
int squared(int i)
{
return i*i;
}
void print(int &i)
{
std::cout << i << " ";
}
答案 0 :(得分:5)
对于std::transform
,操作员应该没有副作用(它应该接受输入并提供输出)。所以你应该尝试制作参考const:
int squared(const int &i)
{
return i*i;
}
引用CPP Reference,“[函数]必须没有副作用”(C ++),并且“[函数]不能使任何迭代器无效,包括结束迭代器,或修改涉及范围的任何要素。“ (C ++ 11)
这基本上意味着传递给你的函数的东西应该被认为是不可变的...因此,如果你通过引用传递,它应该是一个const引用。
相反,std::for_each
对您传递的一系列数据进行操作,这意味着可以修改这些值。