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)来重载它
谢谢。
为您的类或更简单的类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)