2012-11-17 66 views
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 。如何在我的標題中使用模板函數lessThangreaterThanp2dL進行排序?即基於xy值對列表排序。

編輯:那麼,根據安東的評論,我想出了這個:

bool Point2D::operator<(Point2D p2d) { 

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

     return true; 

    } 

    else { 

     return false; 

    } 

} 

難道我這樣做是正確?

+0

您需要爲您的類實現<運算符,否則編譯器不知道如何處理比較。 – SinisterMJ

+0

訂購兩個2D點沒有「正確」方式。你必須決定哪個任意選擇適合你的問題。 – juanchopanza

回答

2

首先,三大模板可以暴露只是operator <()只要你執行嚴格的順序:

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 <()以將*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>); 

希望有所幫助。

1

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

p2dl.sort(lessThan<Point2D>); 

但是你要實現點類型的術語和lessThangreaterThan類似的功能。例如:

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

    return (p1.x > p2.y); 

} 

注意上面的比較功能僅僅是一個例子,你必須決定如何實現小於和大於二維點。

爲了完整起見,這裏使用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); 
}