📜  C++中的Comparator类及其示例(1)

📅  最后修改于: 2023-12-03 14:59:50.156000             🧑  作者: Mango

C++中的Comparator类及其示例

在 C++ 中,Comparator 是一个通用的抽象类,用于比较两个对象。它提供了一种通用的方法,可以将两个对象进行比较,并返回一个可比较的结果。Comparator 常用于排序和搜索算法中,以确定对象之间的顺序。

std::Comparator

在 C++ 中,std::Comparator 类是一个泛型类(generic class),用于比较两个对象。它的声明如下所示:

template <typename T>
class Comparator {
  public:
    virtual bool operator() (const T& a, const T& b) const = 0;
};

在该声明中,T 是要比较的对象类型,operator() 是比较函数(comparison function),它接受两个对象引用,并返回一个布尔值。如果 a 按照某种顺序小于 b,则返回 true,否则返回 false

std::lessstd::greater 类模板

C++ 标准库提供了两个常见的比较函数模板 std::lessstd::greater,它们实现了 std::Comparator 接口。std::less 模板用于比较对象的默认排序顺序(通常是 < 运算符),std::greater 则用于比较反向排序(通常是 > 运算符)。

下面是 std::lessstd::greater 的具体实现:

template <typename T>
struct less {
  bool operator() (const T& a, const T& b) const {
    return a < b;
  }
};

template <typename T>
struct greater {
  bool operator() (const T& a, const T& b) const {
    return a > b;
  }
};
使用 Comparator 进行排序

在 C++ 中,我们可以使用 std::sort 算法对容器进行排序。std::sort 接受三个参数:第一个参数是需要排序的容器,第二个参数是排序的起始位置,第三个参数是排序的结束位置。此外,我们还可以提供一个可选的第四个参数,它是一个比较函数,用于指定排序的顺序。

下面是使用 std::sort 进行排序的例子,其中使用了 std::less 进行默认排序:

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
  std::vector<int> v {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5};

  std::sort(v.begin(), v.end(), std::less<int>());

  for (int i : v) {
    std::cout << i << " ";
  }
  std::cout << std::endl;

  return 0;
}

输出结果:

1 1 2 3 3 4 5 5 5 6 9
自定义 Comparator

如果我们要使用自定义的比较函数,可以继承 std::Comparator,并重新定义 operator() 函数。下面是一个例子,其中我们自定义了一个 Person 类型,以及一个比较函数 compareByAge,用于按照年龄从小到大排序:

#include <iostream>
#include <vector>
#include <algorithm>

struct Person {
  std::string name;
  int age;
};

struct compareByAge : std::Comparator<Person> {
  bool operator() (const Person& a, const Person& b) const {
    return a.age < b.age;
  }
};

int main() {
  std::vector<Person> v {
    {"Alice", 20},
    {"Bob", 24},
    {"Charlie", 18},
    {"Dave", 32},
    {"Eve", 28}
  };

  std::sort(v.begin(), v.end(), compareByAge());

  for (const Person& p : v) {
    std::cout << p.name << " (" << p.age << ")" << std::endl;
  }

  return 0;
}

输出结果:

Charlie (18)
Alice (20)
Bob (24)
Eve (28)
Dave (32)