1

我有一个标题,它由不同的模板函数组成

#include <cmath>

template<class T>
bool lessThan(T x, T y) {

    return (x < y);

}

template<class T>
bool greaterThan(T x, T y) {

    return (x > y);

}

一类

class Point2D {
public:
    Point2D(int x, int y);
protected:
    int x;
    int y;
    double distFrOrigin;

在我的驱动程序类中,我有一个 Point2D: 的 STL 列表list<Point2D> p2dL。如何p2dL使用模板函数lessThangreaterThan在我的标题中进行排序?即基于xy值对列表进行排序。

编辑:所以,根据安东的评论,我想出了这个:

bool Point2D::operator<(Point2D p2d) {

    if (this->x < p2d.x || this->y < p2d.y
            || this->distFrOrigin < p2d.distFrOrigin) {

        return true;

    }

    else {

        return false;

    }

}

我做对了吗?

4

2 回答 2

2

首先,只要operator <()您强制执行严格的排序,所有三个主要模板都可以使用 a 公开:

template<class T>
bool lessThan(const T& x, const T& y) 
{
    return (x < y);
}

template<class T>
bool greaterThan(const T& x, const T& y) 
{
   return (y < x);
}

template<class T>
bool equals(const T& x, const T& y) 
{
   return !(x < y) || (y < x));
}

接下来,您的类必须实现operator <()以将 a*this与参数进行比较。示例如下所示:

class Point2D {
public:
    Point2D(int x, int y);

    // sample that orders based on X primary, and Y if X's are equal.
    bool operator <(const Point2D& other) const
    {
        return (x < other.x || (x == other.x && y < other.y));
    }

protected:
    int x;
    int y;
    double distFrOrigin;
};

最后。像这样对您的列表进行排序:

// sort ascending
std::sort(p2dl.begin(), p2dl.end(), lessThan<Point2D>);

// sort descending
std::sort(p2dl.begin(), p2dl.end(), greaterThan<Point2D>);

或者正如胡安指出的那样,直接使用列表排序:

p2dl.sort(lessThan<Point2D>);

希望有帮助。

于 2012-11-17T08:31:30.690 回答
1

您可以std::list::sort直接使用该方法,而不是std::sort

p2dl.sort(lessThan<Point2D>);

但是您必须根据 Point 类型实现lessThangreaterThan/或类似的功能。例如:

template<class T>
bool greaterThan(const T& p1, const T& p2) {

    return (p1.x > p2.y);

}

请注意,上述比较函数只是一个示例,您必须决定如何使用 2D 点实现小于和大于。

为了完整起见,这里是一个字典比较,使用std::tie

template<class T>
bool greaterThan(const T& p1, const T& p2) 
{
    return std::tie(p1.x, p1.y) > std::tie(p2.x, p2.y);
}
于 2012-11-17T08:11:46.853 回答