【问题标题】:Using functors with STL algorithms versus lambda expressions? [duplicate]使用带有 STL 算法的函子与 lambda 表达式? [复制]
【发布时间】:2016-12-09 18:53:45
【问题描述】:

Stroustrup 给出了在变换操作期间使用重载的operator() 对向量元素执行函数的示例:

class Example
{
  public:
   std::vector<int> Test1 {1,2,3,4,5};
   std::vector<int> Test2;
   int operator()(int el);
   void MyFunction();
}

int Example::operator()(int el)
{
  return el + 1;
}

void Example::MyFunction()
{
std::transform(Test1.begin(), Test1.end(), std::back_inserter(Test2), std::bind(Example(), std::placeholders::_1))
}

但是,与 lambda 表达式相比,上面的代码看起来非常冗长:

std::transform(Test1.begin(), Test1.end(), std::back_inserter(Test2), [](int el){return el + 1;});

我是否正确地说使用重载的operator() 方法没有什么价值?或者在使用 STL 算法时,它们是否仍然有用?

【问题讨论】:

  • 您的标题是通用的 - 运算符重载 - 但实际上您的意思是 operator() 重载,更准确地说,是使用函子。我将编辑问题。
  • 为什么在第一个示例中使用std::bind

标签: c++ algorithm lambda stl


【解决方案1】:

是的,你是对的。

lambda 表达式基本上创建了一个无名仿函数。它只是允许程序员用更少的代码来完成它。在 C++11 之前,标准算法只能与函子一起使用,这需要程序员为某些特定行为(就像您刚才所做的那样)设置一个全新的类。

这正是将 lambda 引入 C++11 的原因,以确保将标准算法与自定义函子一起使用不再那么痛苦。

【讨论】:

    【解决方案2】:

    正如 Gill Bates 所说,您是对的,lambda 表达式确实创建了一个无名函子。但是,它也会使代码更难阅读。我发现,在协作项目中,如果某个东西被多次使用,特别是在一些复杂的事情发生时,让操作符重载通常会更清楚。

    请注意,如果您有节制地使用 lambda,它们会很好。对于重要且经常与对象一起使用的功能,您可能希望将所有此类交互封装在重载运算符中。

    【讨论】:

      猜你喜欢
      • 2014-07-13
      • 2014-02-01
      • 1970-01-01
      • 2013-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-11
      • 2016-08-10
      相关资源
      最近更新 更多