2015-05-23 79 views
0

我能够分别读取文件和填充矢量。创建泛型模板类,通过变量对不同类进行排序

有没有一种方法可以创建一个模板来按照一个标准对各个类进行排序? 我使用的方法是单调乏味的,我必须创建很多模板类来适应每个向量。

我需要一些想法上创建一个通用模板

//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

目前还不清楚您是否有多个不同的排序标准。 – b4hand

+0

没有你向我们展示你的各种类的接口,也不可能建议一个通用的实现。 – b4hand

回答

0

工作更好的方式来做到这一点为每个相应的排序顺序创建单独的比较器类,这些排序顺序一般适用于所有的排序顺序spective类型可以传递给内置的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())); 
    } 
} 
0

std::sort是通用排序,允许您提供自定义排序标准。

例如,对点,线一些容器等,l

sort(begin(l), end(l), [](auto& a, auto& b) 
{ 
    return a.getX() < b.getX(); 
}); 
+1

注意:通用lambdas是一个C++ 14功能。 –

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; 
}