1

我想对 a 进行排序vector<vector<double> >并记录原始索引vector<int>

ex A[0][1].............[N], and A[0][0] = X, A[0][1] = Y, A[0][2] = Z
                    A[0] = (1,5,3), A[1] = (3,2,1) A[2] = (2,8,4) after sorting
    index:            0               1             2
                    A[0] = (1,5,3), A[1] = (2,8,4) A[2] = (3,2,1)
    original index :  0               2             1

所以我写了下面的代码,我想用STL排序,但是不知道怎么写比较函数。

class point{
    public:
    point(int totalLength = 0, int elementLength = 0);
    vector<vector<double> > pointSet;
    vector<double> pointIndex;
};
point::point(int totalLength, int elementLength){
    pointSet.resize(totalLength,vector<double>(elementLength, 0));
    pointIndex.resize(elementLength);
}

和建议或其他方式来实现它?

感谢您的阅读。

4

1 回答 1

1

我要说的第一件事是为点引入单独的数据结构。通常,当您谈论点和某些几何时,您会知道确切的数字维度。所以,你可以使用

struct Point
{
double x;
double y;
double z;
};

代替

std::vector<double>

即使你不知道维数,你最好使用

typedef std::vector<double> Point;

来表示一个点。

而你的std::vector<std::vector<double> >变成std::vector<Point>. 至少更容易阅读。

然后,不可能同时对 2 个数组进行排序,使用std::sort. 因此,您必须将您的pointSetpointIndex数组组合在一个数据结构中才能进行排序。

一个明显的方法,你可以创建

typedef std::pair<Point, int> IndexedPoint;
std::vector<IndexedPoint> indexedPoints;

然后用给定的点及其索引填充这个结构,然后排序:

for(int indx = 0; indx < pointsSet.size(); ++indx) {
    indexedPoints.push_back(std::make_pair(pointsSet[indx], indx));
}
std::sort(indexedPoints.begin(), indexedPoints.end(), &lessThen);

更少的实现取决于比较算法。例如,如果你想通过第一个坐标比较点,你可以写

bool lessThen(const IndexedPoint& l, const IndexedPoint& r)
{
    return l.first.x < r.first.x; //or return l.first[0] < r.first[0]; -- ensure point has at lest 1 dimension here!
}
于 2013-05-04T20:10:05.960 回答