我的问题/疑虑是关于要在 std::transform()
中使用的函数参数.
在下面的代码中,如果我在整数参数 i
中使用了“按引用传递”的平方函数(即 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 << " ";
}
最佳答案
对于 std::transform
,运算符应该没有副作用(它应该接受输入并提供输出)。所以你应该尝试使引用常量:
int squared(const int &i)
{
return i*i;
}
引自CPP Reference 、“[函数] 不得有副作用”(C++),以及“[函数] 不得使任何迭代器无效,包括结束迭代器,或修改所涉及范围的任何元素。 “(C++11)
这基本上意味着传递给你的函数的东西应该被认为是不可变的......因此如果你通过引用传递,它应该是一个常量引用。
相反,std::for_each
对您传递给它的一系列数据进行操作,这意味着可以修改这些值。
关于c++ - std::transform() 在函数参数中传递引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18957848/