21xrx.com
2024-11-22 07:26:45 Friday
登录
文章检索 我的文章 写文章
C++函数对象
2023-07-02 05:41:03 深夜i     --     --
函数对象 C++ 函数指针 STL Lambda表达式

C++函数对象(Function Objects)是一种可调用对象,可以像函数一样使用并传递给函数或算法。它们是一种重载运算符 () 的特殊类,因此也被称为函数符。C++标准库中的大多数算法都需要传递函数对象,例如 std::sort()、std::for_each()、std::transform() 等。

函数对象可以使算法更加灵活,因为它们允许我们定义自己的操作和比较方式。使用函数对象,我们可以在不改变算法本身的情况下重新定义元素的比较方式,从而使算法适应不同的需求。

例如,如果我们想要排序一个数组,但是我们希望将其按照某些特定的规则进行排序,而不是默认的小于运算符。那么我们可以定义一个函数对象来实现我们的想法。下面是一个示例:


class SortByLength {

public:

  bool operator()(const std::string& s1, const std::string& s2) const {

    return s1.length() < s2.length();

  }

};

上面的代码定义了一个函数对象类 SortByLength,其中重载了 () 运算符实现了按照字符串长度进行排序的逻辑。我们可以将这个函数对象传递给 std::sort() 函数来排序一个字符串数组:


std::string arr[] = "hello";

std::sort(arr, arr + 6, SortByLength());

这将按照字符串长度对数组进行排序。我们可以通过改变 SortByLength 类中的逻辑来定义自己的排序规则,并将其传递给 std::sort() 函数来使用。

还有一种更简单的方式可以定义函数对象,即使用 lambda 表达式。Lambda 表达式是一种匿名函数,可以方便地定义函数对象。同样以按照字符串长度排序为例,我们可以这样定义一个 lambda 表达式:


std::sort(arr, arr + 6, [](const std::string& s1, const std::string& s2) {

  return s1.length() < s2.length();

});

lambda 表达式被放在一个没有名称的闭包中,并通过 [] 捕获局部变量。这个例子中我们没有捕获任何变量,但是我们可以捕获任何在 lambda 表达式中使用的变量。

使用函数对象可以使我们的代码更加灵活和可重用。它们允许我们定义自己的操作和比较方式,并将其传递给算法,从而使算法适应不同的需求。如果您正在学习 C++,重载运算符和函数对象一定是您需要掌握的一部分。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复