使用具有STL算法与Lambda表达式的函子
Using functors with STL algorithms versus lambda expressions?
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算法时仍然有场景可以有益?
是的,你是对的。
lambda表达式基本上创建一个无名函数。它只允许程序员以更少的代码进行操作。在C 11之前,标准算法只能与函子一起使用,该算法需要程序员为某些特定行为设置一个全新的课程(就像您刚刚做到的那样)。
这正是将lambda引入C 11的原因,以确保使用具有自定义函数的标准算法再不再痛苦。
正如吉尔·贝茨(Gill Bates)提到的那样,您是正确的,lambda表达式确实会创建一个无名函数。但是,它还可以使代码更难阅读。我发现,在协作项目中,如果使用不止一次使用,则通常会更清楚地超载操作员,尤其是在发生复杂的事情时。
在这一点上,如果您很少使用Lambdas,则很好。对于至关重要的功能并经常与对象一起使用,您可能需要将所有此类交互封装在超载运算符中。
相关文章:
- 这 4 个 lambda 表达式之间有什么区别?
- 使用成员在类中创建 lambda 表达式
- 使用自动推导的 lambda 参数作为常量表达式
- 将 lambda 表达式传递给 std::function in C++
- 在 lambda 表达式中使用 std::atomic
- 不是 lambda 函数中的常量表达式
- &&对lambda表达式有什么好处?
- Tbb 库:错误:编写自定义类函数而不是 lambda 表达式时,对函数的调用不匹配
- 列表.erase 中的 lambda 表达式
- 使用 lambda 表达式的 Raspbian G++ 8.3.0 导致 ']' 之前的预期主表达式 - 即使标准设置为 c++14
- 仅通过引用捕获的 lambda 表达式是否保证不会抛出?
- C++: priority_queue:模板参数中的 lambda 表达式
- 容器如何处理 lambda 表达式的参数
- 在C++ Lambda 表达式中,为什么人们更喜欢按值捕获而不是作为参数传递?
- 如何在 lambda 表达式中传递变量?
- 针对 std::function 的 lambda 表达式和模板推导:为什么会这样?
- 如何修改Lambda表达式以将输出放入文本文件
- C++如何使用lambda表达式来捕获上一次迭代的值
- 为什么Qt在信号和插槽中为lambda表达式抛出错误?
- C++:从捕获函数参数的函数返回 lambda 表达式