1

我的问题/担忧是关于要在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 << "  ";
}
4

1 回答 1

5

对于 a std::transform,操作符应该没有副作用(它应该接受输入并提供输出)。因此,您应该尝试将引用设为 const:

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

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

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

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

于 2013-09-23T12:34:47.343 回答