当前位置:   article > 正文

C++(16): STL:函数对象(仿函数)

C++(16): STL:函数对象(仿函数)

1. 简述

        函数对象是“重载函数调用操作符”的类,由于其使用时类似于调用一个函数,所以也称作“仿函数”。

        通俗来讲,就是我们构建一个类,在类的内部重载了“()”操作符,然后在使用的时候我们可以像调用函数一样来调用类的对象

        不同于普通的函数,函数对象可以拥有自己的状态。

2. 用途

函数对象用作算法参数

        典型的,我们调用std::sort进行排序的时候,如果我们使用的是int、float等普通的数据类型,那么我们可以使用默认的排序方法。但是对于一些自定义结构化数据,我们就需要自行创建一个排序的方法。

  1. #include <algorithm>
  2. #include <vector>
  3. #include <string>
  4. #include <iostream>
  5. /** 自定义结构体. */
  6. struct Person {
  7. std::string name;
  8. int age;
  9. Person(std::string n, int a) : name(std::move(n)), age(a) {}
  10. };
  11. /** 函数对象(仿函数) */
  12. struct AgeComparator {
  13. bool operator()(const Person& a, const Person& b) const {
  14. return a.age < b.age;
  15. }
  16. };
  17. int main(int argc, char* argv[])
  18. {
  19. std::vector<Person> people = {
  20. Person("Alice", 30),
  21. Person("Bob", 20),
  22. Person("Charlie", 25)
  23. };
  24. /** 使用AgeComparator函数对象进行排序. */
  25. std::sort(people.begin(), people.end(), AgeComparator());
  26. for (const auto& person : people) {
  27. std::cout << person.name << ": " << person.age << std::endl;
  28. }
  29. return 0;
  30. }

        除了上述使用方式以外,还可以在查找函数std::find_if,std::count_if

等函数中作为功能块进行使用。

3. 函数对象的构造

        要创建一个函数对象,我们首先需要定义一个类,并重载它的operator()。这个操作符可以重载为接受不同数量的参数,从而实现不同的行为。下面是一个简单的函数对象示例:

  1. class Adder {
  2. public:
  3. int operator()(int a, int b)
  4. {
  5. return a + b;
  6. }
  7. };

在这个例子中,Adder类定义了一个接受两个整数参数并返回它们的和的函数对象。我们可以通过创建Adder类的实例并调用它,就像调用一个普通函数一样:

Adder adder;

int result = adder(3, 4); ///< result 等于 7

4. 函数对象状态

前面讲到,函数对象可以拥有自己的状态信息。

通俗讲,函数对象本身是一个类,所有自然是可以拥有一些数据成员。这些数据成员就可以作为状态载体来使用。话不多说,直接上例程。

  1. class Counter {
  2. public:
  3. int count() { return ++total; }
  4. private:
  5. static int total;
  6. };
  7. int Counter::total = 0;
  8. /** 使用函数对象. */
  9. Counter counter;
  10. for (int i = 0; i < 5; ++i) {
  11. std::cout << counter() << std::endl; ///< 输出 1, 2, 3, 4, 5
  12. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/451972
推荐阅读
相关标签
  

闽ICP备14008679号