C ++中的结构比较器构造函数与运算符()

struct comparator constructor vs operator () in c++

我有这个代码:

struct PointComparator
{
   explicit PointComparator(const Point& lowest)
      : m_lowest(lowest)
   {}
   
   bool operator()(const Point& a, const Point& b)
   {
      std::cout << m_lowest[0] << std::endl;
      return; // TODO
   }

private:
   Point m_lowest;
};

// in another function:
Point lowestPoint;  // (get this from somewhere)
std::sort(points.begin(), points.end(), PointComparator(lowestPoint));

我只是对 explicit 关键字感到困惑。当我进行正常排序时,我会调用 sort(sort(points.begin(), points.end(), compar()) 之类的东西,并且 compar() 指向 bool operator()(const Point& a, const Point& b) 函数,但现在 PointComparator(lowestPoint) 指的是构造函数,那么它仍然如何工作?

When I do a normal sort, I would call something like sort(sort(points.begin(), points.end(), compar()), and compar() points to the bool operator()(const Point& a, const Point& b) function, [...]

实际上,没有。传递给 sort 的第三个参数是一个比较器。它可以是具有 operator() 的函数对象。您没有将其 operator() 传递给算法。

当你写:

std::sort(points.begin(), points.end(), PointComparator(lowestPoint));

这与

大致相同
PointComparator compare(lowestPoint);
std::sort(points.begin(), points.end(), compare);

PointComparator(lowestPoint) 正在调用构造函数。创建的对象被传递给 sort 并且仅在内部 sort 调用 operator().

这里的explicit只是表示阻止了从PointPointComparator的隐式转换。它实际上对您的代码没有影响。

When I do a normal sort, I would call something like sort(sort(points.begin(), points.end(), compar()), and compar() points to the bool operator()(const Point& a, const Point& b) function

不,不是。 compar() 是已初始化值的临时对象的语法。

but now PointComparator(lowestPoint) refers to the constructor so how does it still work?

您传递给构造函数的参数会影响调用哪个构造函数。在 compar() 的情况下,使用默认构造函数,在 PointComparator(lowestPoint) 的情况下,使用转换构造函数。它之所以有效,是因为 PointComparator 有一个适当类型的转换构造函数。

I'm just confused on the explicit keyword.

这意味着构造函数不能用于隐式转换。它会阻止以下工作:std::sort(b, e, lowestPoint);。通常建议避免隐式转换构造函数。