2013-05-04 55 views
1

動我想排序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); 
} 

和建議或其他方式來實現它?

感謝您的閱讀。

+2

爲什麼不引入特殊的'結構Point'而不是內部'向量'? – Lol4t0 2013-05-04 19:26:37

+0

輸入是一個常量向量<向量>。 – 2013-05-04 19:28:20

+2

所以,你有機會改進它,用'vector '代替(如果它實際上是點的矢量)。想想看。 – Lol4t0 2013-05-04 19:29:47

回答

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>。至少閱讀起來更容易。

然後,使用std::sort不可能同時對2個陣列進行排序。因此,您必須將您的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! 
}