根据分量1、2(和3)对空间(2D / 3D)向量的向量进行排序

时间:2018-09-12 00:14:46

标签: c++ sorting

我有一个vclass Tfloat)的模板化向量double,其中包含N*D(= npoints*ndims)个元素。 例如,对于D = 2,v将包含[ p0[0], p0[1], p1[0], p1[1], p2[0], p2[1], ... pN-1[0], pN-1[1] ]

我想获得lsort索引的向量N,该索引对应于对点进行升序排序,首先根据坐标0,然后根据坐标1。 没有巧合的点。

例如,如果点(p0 ... pN-1)是((0,0),(0,1),(1,2),(1,0)),我的意思是:

v = [ 0, 0, 0, 1, 1, 2, 1, 0 ]
lsort = [ 0, 1, 3, 2 ]

因为p3的坐标0与p2相同,但坐标1较低。

我不在乎获取排序的向量(一旦有了lsort,我就可以这样做)。

我之前曾与自定义运算符进行过比较,但是我没有弄清楚比较如何跳过其他所有元素。

1 个答案:

答案 0 :(得分:2)

首先生成一个包含浮点指针(或迭代器)的向量容器,其中元素指向每个第D个元素,即每个空间向量的第一个维度。

然后使用自定义比较功能std::sort来创建指针向量,该字典功能对left[0], right[0]进行字典比较,然后对left[1], right[1]进行最后的left[D-1], right[D-1]比较(如果先前所有比较均相等)

现在,您可以在想要的排序中拥有一个指向每个空间向量的指针的向量容器。如果要获取这些空间矢量的索引,只需从指针矢量的每个元素中减去指向v的第一个元素的指针。这将是v中的索引。除以D得到与您的示例输出匹配的索引。

或者,您可以从D-1生成的0到std::iota的索引序列开始,并使用更复杂的比较函数,该函数执行从索引到坐标的转换。