创建通用模板类以按变量对不同的类进行排序

时间:2015-05-23 04:39:13

标签: c++ sorting templates

我能够分别读取文件并填充矢量。

有没有办法根据标准创建模板来对各个类进行排序? 我使用的方法很繁琐,我必须创建很多模板类来适应每个向量。

我需要一些关于创建通用模板的想法

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

}

3 个答案:

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