std :: transform()在函数参数中传递引用

时间:2013-09-23 11:13:45

标签: c++ algorithm reference

我的问题/疑虑是关于std::transform()中使用的函数参数。

在下面的代码中,如果我在平方函数的整数参数i中使用“pass-by-reference”(即int squared(int i)),则它不会编译。

我必须将其更改为按值传递,以便进行编译。任何人都可以告诉我为什么以及这是否是使用std::transform()

的cosntraint

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 << "  ";
}

1 个答案:

答案 0 :(得分:5)

对于std::transform,操作员应该没有副作用(它应该接受输入并提供输出)。所以你应该尝试制作参考const:

int squared(const int &i)
{
    return i*i;
}

引用CPP Reference,“[函数]必须没有副作用”(C ++),并且“[函数]不能使任何迭代器无效,包括结束迭代器,或修改涉及范围的任何要素。“ (C ++ 11)

这基本上意味着传递给你的函数的东西应该被认为是不可变的...因此,如果你通过引用传递,它应该是一个const引用。

相反,std::for_each对您传递的一系列数据进行操作,这意味着可以修改这些值。