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

标签 c++ algorithm reference

我的问题/疑虑是关于要在 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/

相关文章:

c++ - Bazel 使用 ccache 构建 C++ 示例失败

c++ - 为什么减少窗口长度会导致频谱图中出现空行?

c++ - 骰子分布的直方图

c++ - 使用 const 类型标记变量

swift - 如何识别 Swift 中的强引用循环?

c++ - QStandardItemModel Qt

c++ - 什么是选择器和更改器(mutator)?

algorithm - 通过特定顶点的有向图中最轻量级的圆

arrays - 平衡数组子区间中元素数量的算法?

c++ - 返回指向引用的指针