我有一个模板化向量v
class T
(float
或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] ]
。
我想得到一个N
索引的向量lsort
,这些索引对应于对点进行升序排序,首先根据坐标 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
,我就可以这样做(。
我之前与自定义运算符进行了比较,但我没有弄清楚比较如何跳过所有其他元素。
首先生成浮点指针(或迭代器(的向量容器,其中元素指向每个D
元素,即每个空间向量的第一维。
然后使用自定义比较函数std::sort
指针向量,该函数对left[0], right[0]
进行字典比较,然后left[1], right[1]
直到最终left[D-1], right[D-1]
是否所有先前的比较都相同。
现在,您有一个指向每个空间向量的指针的向量容器,按所需的排序进行排序。如果要获取这些空间向量的索引,只需从指针向量的每个元素中减去指向v
第一个元素的指针。这将是v
内的索引。除以D
以获得与示例输出匹配的索引。
或者,您可以从使用std::iota
生成的从 0 到D-1
的索引序列开始,并使用更复杂的比较函数,该函数执行从索引到坐标的转换。