排序n维点并跟踪原始索引

时间:2013-05-04 15:30:12

标签: c++ algorithm

我在vector< vector<double> >

中有一组n维点存储
ex A[0][1].............[N], and A[0][0] = X, A[0][1] = Y, A[0][2] = Z

我希望对所有维度

的矢量进行排序
ex sort X, Y, Z ,.........N in ascending order


ex              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

我发现sort(vector.begin(), vector.end())可以对其进行排序,但如何使用其他向量记录原始索引?

是否有算法或C ++功能可以解决它?

提前谢谢。

1 个答案:

答案 0 :(得分:1)

您需要以某种方式保留有关索引的信息。 我可以看到两种方法:

1 - 由于您通过向量表示您的点,您可以使用另一个代表原始索引的维度:

  

//添加索引信息,重要的是索引是最后一个维度,否则排序不正确   for(auto point = vector.begin(),unsigned int index = 0; point!= vector.end(); ++ point,++ index){       点对多点&GT;的push_back(指数)   };

然后按照现在的方式进行排序:

  

sort(vector.begin(),vector.end())

并使用A [0] [n]

访问原始索引

很酷的是,它允许您以非常方便的方式跟踪索引,但是您需要能够修改您的点的表示。

2-另一种方法是拥有一个索引的外部表,并使用自定义comp进行排序。运营商:

首先创建一个索引向量

  

std :: vector indices(vector.size());

     

for(unsigned int index = 0; index!= indicies.size(); ++ point){       指标[指数] =指数;   };

     

//并排序......

     

std :: sort(indices.begin(),indices.end(),[&amp;](unsigned int i,unsigned int j){return vector [i]&lt; vector [j]})

现在您需要一个额外的间接级别来按顺序排列您的点数: A [指数为[0]],A [指数[1]],... 所以A [indices [x]]的原始位置只是x

要记住这两种方式之间的主要原因是,在第一次移动数据时而不是在第二次移动数据时,根据您在点上的操作,可能会更好一点