C ++如何使用模板对向量进行排序

use*_*897 0 c++ sorting templates vector

C ++如何使用模板对向量进行排序

大家好,谢谢您看我的问题。

我得到了一个Templates.h文件,它就是这种方式。

/* Template Less Than */

template<typename T>
bool lessThan(T a,T b)
{
return a<b;
}

/* Template greater Than */

template<typename T>
bool greaterThan(T a,T b)
{
return a>b;
}

/* Template Equals */

template<typename T>
bool equals(T a,T b)
{
return a==b;
}
Run Code Online (Sandbox Code Playgroud)

然后我上了这堂课

Map2D
Run Code Online (Sandbox Code Playgroud)

关于Map2D

class Map2D
{
protected:
int x;
int y;

public:
Map2D();
Map2D(int,int);
int getX();
int getY();
};
Run Code Online (Sandbox Code Playgroud)

在我的main.cpp中,我得到了Map2D的向量类

vector<Map2D> map2d;
Run Code Online (Sandbox Code Playgroud)

因此,现在我需要按X升序对它进行排序..我如何利用模板文件对它的X升序进行向量排序。。考虑一下以后我需要重载另一个以降序。

通常我会用

sort(map2d.begin(),map2d.end(),sortByX);
Run Code Online (Sandbox Code Playgroud)

并且sortByX将是带有重载其()运算符的结构。

但是现在的问题是,因为我得到了一个小于和大于的模板。如何使用升序对X进行排序,然后使用Templates.H的模板泛型函数对另一个X进行降序排序。

更新:

我认为我需要重载Map2D运算符>,<和==

但是我的问题是如何借助MyTemplates.h函数(如lesserThan,GreaterThan,equals)来重载它

谢谢。

Who*_*aig 5

为您的类或更简单的类operator<()(重载)定义一个比较器(无论如何,您都需要这样做才能使模板正常工作)。

首先,修复您的模板:

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

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

template<typename T>
bool equals(const T& a, const T& b)
{
    return !(a<b || b<a);
}
Run Code Online (Sandbox Code Playgroud)

接下来,在您的类上定义一个operator <()。

class Map2D
{
protected:
    int x;
    int y;

public:
    Map2D();
    Map2D(int,int);
    int getX();
    int getY();

    // this sample sorts on X dominantly, and Y if X is the same
    bool operator <(const Map2D& obj) const
    {
        return (x < obj.x || (x == obj.x && y < obj.y));
    };
}
Run Code Online (Sandbox Code Playgroud)

现在只需调用sort:

std::sort(map2d.begin(), map2d.end());
Run Code Online (Sandbox Code Playgroud)

像这样使用您的lessThan模板进行调用:

std::sort(map2d.begin(), map2d.end(), lessThan<Map2D>);
Run Code Online (Sandbox Code Playgroud)

或您的greatThan模板:

std::sort(map2d.begin(), map2d.end(), greaterThan<Map2D>);
Run Code Online (Sandbox Code Playgroud)