我能够分别读取文件并填充矢量。
有没有办法根据标准创建模板来对各个类进行排序? 我使用的方法很繁琐,我必须创建很多模板类来适应每个向量。
我需要一些关于创建通用模板的想法
//consist if accessors and mutator x and y
vector<Point2D> point2d;
//consist if accessors and mutator x and y and z
vector<Point3D> point3d;
//consist if accessory and mutator 2 Point2D point
vector<Line2D> line2d;
//consist if accessory and mutator 2 Point3D point
vector<Line3D> line3d;
//sort_crit is a global variable that change according to user menu
//sort_order is a global variable that change according to user menu (ASC or DSC)
if(sort_crit == "X-Coordinate") {
sortByX(point2d, point2d.size(), sort_order);
}
我的数据
Point2D, [3, 2]
Line3D, [7, 12, 3], [-9, 13, 68]
Point3D, [1, 3, 8]
Line3D, [7, -12, 3], [9, 13, 68]
Point3D, [6, 9, 5]
Point2D, [4, 8]
Line3D, [70, -120, -3], [-29, 1, 268]
Line2D, [7, 12], [-9, 4]
Line3D, [25, -69, -33], [-2, -41, 58]
Point3D, [6, 9, -50]
Point2D, [12, 80]
Point2D, [9, 8]
我当前的模板仅适用于Point2D
template <class T>
void sortByX(vector<T> a1, int size, string type) {
if (type == "ASC") {
for(int x=0; x<size; x++) {
for(int y=0; y<size-1; y++) {
if(a1[y].getX()>a1[y+1].getX()) {
int tempx = a1[y+1].getX();
a1[y+1].setX(a1[y].getX());
a1[y].setX(tempx);
int tempy = a1[y+1].getY();
a1[y+1].setY(a1[y].getY());
a1[y].setY(tempy);
}
}
}
} else if (type == "DSC") {
for(int x=0; x<size; x++) {
for(int y=0; y<size-1; y++) {
if(a1[y].getX()<a1[y+1].getX()) {
int tempx = a1[y+1].getX();
a1[y+1].setX(a1[y].getX());
a1[y].setX(tempx);
int tempy = a1[y+1].getY();
a1[y+1].setY(a1[y].getY());
a1[y].setY(tempy);
}
}
}
}
for(int x=0; x<size; x++) {
cout << a1[x] << endl;
}
}
答案 0 :(得分:1)
std::sort
是通用排序,允许您提供自定义排序标准。
l
:
sort(begin(l), end(l), [](auto& a, auto& b)
{
return a.getX() < b.getX();
});
答案 1 :(得分:0)
更好的方法是为每个相应的排序顺序创建单独的比较器类,这些排序顺序通常适用于可以传递给内置std::sort
算法的所有相应类型。
template<typename T>
class ByXAscending {
bool operator()(T const &lhs, T const &rhs) const {
return (lhs.getX() < rhs.getX()
|| (lhs.getX() == rhs.getX()
&& lhs.getY() == rhs.getY()));
}
}
答案 2 :(得分:0)
为什么要推出自己的排序功能?尝试这样的事情:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct Point2D
{
Point2D(int x=0, int y=0) : x(x), y(y) {}
int x;
int y;
};
ostream& operator<<(ostream &os, const Point2D &p)
{
os << "{" << p.x << ", " << p.y << "}";
return os;
}
int main(int argc, char *argv[])
{
vector<Point2D> points;
points.push_back(Point2D(3, 3));
points.push_back(Point2D(27, 5));
points.push_back(Point2D(7, 4));
points.push_back(Point2D(13, 26));
points.push_back(Point2D(9, 5));
cout << "Before sort:" << endl;
for (const auto p : points)
cout << p << " ";
cout << endl;
sort(points.begin(), points.end(), [](const Point2D &l, const Point2D &r)
{
return (l.x<r.x);
});
cout << "Sort by x:" << endl;
for (const auto p : points)
cout << p << " ";
cout << endl;
sort(points.begin(), points.end(), [](const Point2D &l, const Point2D &r)
{
return (l.y<r.y);
});
cout << "Sort by y:" << endl;
for (const auto p : points)
cout << p << " ";
cout << endl;
return 0;
}