2013-05-04 64 views
0

的我在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++功能可以解決它?

Thx提前。

+0

http://stackoverflow.com/questions/1577475/c-sorting-and-keeping-track-of-indexes – 2013-05-04 15:32:03

+0

。把你的n維向量轉換成一維向量,然後調用新向量進行排序。 – Bill 2013-05-04 15:34:12

+0

抱歉,我無法更改其維度,因爲我需要執行以下步驟。 – 2013-05-04 15:36:58

回答

1

您需要以某種方式保留有關索引的信息。 我可以看到這樣做的方法有兩種:

1 - 既然你用一個矢量代表你的時候,你可以有另一個層面,將代表原單指數:

//添加索引信息,inportant (auto point = vector.begin(),unsigned int index = 0; point!= vector.end(); ++ point,++ index){ point-> push_back(index) };

然後梳理你現在正在做同樣的方式:

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

,你訪問與原指數[0] [n]

這很酷的事情是它允許你以一種非常方便的方式跟蹤索引,但是你需要能夠修改你的點的表示。

2-另一種方法是有一個索引的外部表,並使用自定義壓縮排序。運營商:

通過創建索引的矢量開始

的std ::矢量指數(vector.size()); (unsigned int index = 0; index!= indicies.size(); ++ point){ indicies [index] = index;

};

//和排序...

的std ::排序(indices.begin(),indices.end(),[&](無符號整數I,無符號整型j)的{返回向量[I] <向量[J]})

現在你需要額外的間接水平走在了有序低谷您的積分: A [指數[0],A [指數[1],.. 。 因此,A [索引[x]]的原始位置只是x

在這兩種方法中,要記住的主要方法是首先移動數據而不是第二個,具體取決於你是在做你的觀點,有人可能會更好的,如果內存不是一個問題,可能會更好的訂單

+0

謝謝,第一個很酷!我能問問第二種方法嗎?我不明白。 – 2013-05-04 16:31:08

+0

有沒有辦法不修改點,因爲我必須計算最近的距離。 – 2013-05-04 17:03:17