0

我有一组 n 维点存储在vector< vector<double> >

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++ 功能可以解决它?

提前谢谢。

4

1 回答 1

1

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

1-由于你用向量表示你的点,你可以有另一个维度来表示原始索引:

//添加索引信息,重要的是你的索引是最后一维,否则排序不正确 for(auto point = vector.begin(),unsigned int index=0;point != vector.end(); ++point, ++index){ point->push_back(index) };

然后以与您现在相同的方式进行排序:

排序(vector.begin(),vector.end())

并且您使用 A[0][n] 访问原始索引

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

2-另一种方法是拥有一个外部索引表并使用自定义组合对其进行排序。操作员 :

你首先创建一个索引向量

标准::向量索引(向量.size());

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

//然后排序...

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

现在您需要额外的间接级别才能按排序顺序处理您的点: A[indices[0]],A[indices[1]],... 所以 A[indices[x]] 的原始位置是只是 x

在这两种方法之间要记住的主要是,在第一种中移动数据而不是在第二种中移动数据,这取决于您在点上所做的事情,一个可能比顺序更好

于 2013-05-04T16:24:20.313 回答