使用引用或新值的C++算法

C++ algorithm using reference or new value

本文关键字:C++ 算法 新值 引用      更新时间:2023-10-16

我有一个关于使用函子返回值和参数的问题。让我们有这个代码:

int op_increase (int i) { return ++i; }
int main () {
  std::vector<int> foo;
  std::vector<int> bar;
  // set some values:
  for (int i=1; i<6; i++)
    foo.push_back (i*10);                         // foo: 10 20 30 40 50
  bar.resize(foo.size());                         // allocate space
  std::transform (foo.begin(), foo.end(), bar.begin(), op_increase);

现在,函子接受值(caling复制构造函数),当返回值时,它再次调用复制构造函数。我很好奇在使用我认为最快的函子形式时是否出了问题

int& op_increase(int& i) {return ++i;}

或者只是

void op_increase(int& i) {++i;}

谢谢你的回答。

这不是什么对你最好的问题(无论如何,你提出的建议是错误的),而是从std::transform的角度来看什么是正确的问题
有关文档,请参阅此处。

它指出,当你使用一元运算符时,它的符号必须等价于以下内容:

Ret fun(const Type &a);

此外:

签名不需要具有常量&
类型type必须使得typeInputIt的对象可以被取消引用,然后隐式转换为type
Ret类型必须使得OutputIt类型的对象可以被取消引用并被分配一个Ret类型的值。

也就是说,你似乎误解了transform的含义,即:

std::transform将给定的函数应用于一个范围,并将结果存储在另一个范围中

根据你的例子,要么你误解了它,要么它不是你想要的,所以也许transform不是你要的。