我应该将 lambda 或函子用于比较函数吗?
Should I use a lambda or functor for a comparison function?
我正在将一个 C++03 项目重构为 C++11。
我有一个类,其中定义了用于排序的函子:
class Widget
{
public:
class SortByRules
{
public:
bool operator()(const Widget &lhs, const Widget &rhs) const;
}
}
这个函子在我的项目中的各个地方使用。用法示例:
std::vector<Widget> widgets;
// ...
std::sort(widgets.begin(), widgets.end(), Widget::SortByRules());
据我了解,在 C++11 中,lambda 应该优先于函子。但是我不确定在这种情况下我是否应该坚持使用函子,因为我想在整个项目中的多个其他类中调用它。
我正在考虑重构为如下所示的内容:
// .h
class Widget
{
public:
Widget();
std::function<bool(Widget&, Widget&)> SortByRules;
};
// .cpp
Widget::Widget() :
SortByRules([](Widget& lhs, Widget& rhs) { /* ... */ }
{
}
这两种实现本质上是相同的吗?我应该更喜欢一个而不是另一个,如果是这样,为什么?
Lambda 基本上只是函子的语法糖。它们的主要优点是语法密集,您可以内联定义它们,而无需为它们命名。
这个函子在我的项目中的各个地方使用。
如果你想命名类型并在不同的地方使用它,那么使用 lambda 与使用你的函子类相比没有太大的优势。
对于在 lambda 和名称函子之间进行选择,我的建议是: 如果您需要引用函子类型的名称,请使用命名函子,否则您可以使用 lambda(如果您愿意(。
确实需要类型名称的情况是将函子存储为成员变量时。因此,在这种情况下,命名函子会更可取。在这种情况下使用函数包装器会引入不必要的运行时开销。
在某些情况下,您可能需要引用推导参数的类型,其中 lambda 在 c++20 之前不可用。
您可以通过从函数返回 lambda 来使其易于重用。
相关文章:
- C++自定义比较函数
- 使用自定义比较函数使用std::sort()对矢量字符串进行排序时出现问题
- 隐式转换为比较函数对象(函子)用于 std::sort 而不是 std::map?
- 为什么 std::stable_sort() 的比较函数的参数必须是设置常量?
- 如何定义集合数组的比较函数?
- 根据比较函数C++对数组进行排序
- 使用自定义比较函数在类内进行列表排序
- 如何更改 std::set 的比较函数?
- 使用类似的比较函数时,在 c++ 中为 std:sort 获得不同的结果
- std::映射服装比较函数和函数/lambda错误
- 在C++排序中为比较函数指定参数
- 使用右值的比较函数
- 为什么比较函数类型需要指定为模板参数?
- 我应该将 lambda 或函子用于比较函数吗?
- 比较函数模板中的 VARTYPE 和 typeid().name / typename
- 如何键入定义一个专门的 std::set 模板,使用特定的比较函数实例化
- 无法在 std::sort 中使用 cdef 函数作为比较函数
- 关联容器,比较函数不是元素类型的一部分吗?
- 标准::lower_bound的比较函数
- 关于如何在 std::sort 和 std::p riority_queue 中使用自定义比较函数的困惑