2010-06-07 41 views
0

我目前有一個std :: vector,它包含double的std :: vector。我想按雙vectore的第二個元素進行排序。例如: 而不是按MyVec [0]或myvec [1]排序,然後根據myvec [0] [1] myvec [1] [1]對myVec [0]和myvec [1]進行排序。基本上按照包含的值進行排序,而不是其中的對象。由內部的元素排序std :: vector?

因此,如果myvec [0] [1]小於myvec [1] [1],那麼myvec [0]和myvec [1]將交換。 感謝

+0

任何原因,你不能鍵值複製出來的陣列,然後排序,防止競爭條件? – 2010-06-07 22:49:19

+0

@Michael,以上介紹的是比賽條件?就我個人而言,我更關心確保這個向量向量中的每個元素都至少有2個元素。我會被包含在使用'at'函數而不是下標操作符,只是爲了解決這個問題。 – 2010-06-07 23:33:27

+0

根據比較的寫法,部分路徑可能會因排序而改變元素[1],然後如果值未被高速緩存,可能會發生不好的事情。 – 2010-06-08 01:18:26

回答

5

只寫比較:

bool my_comparator(const std::vector<double>& lhs, const std::vector<double>& rhs) 
{ 
    assert(lhs.size() >= 2 && rhs.size() >= 2); 
    return lhs[1] < rhs[1]; 
} 
... 
std::sort(big_vector.begin(), big_vector.end(), my_comparator); 

最好是寫一個函子,而不是一個功能,但概念是相同的。

+0

這讓我感到恐慌......沒有檢查以確保lhs和rhs是否具有size()> = 2'。我可以在函數的入口或者'return lhs.at(1)中聲明以下其中一個:'assert(lhs.size()> = 2)&& assert(rhs.size()> = 2) rhs.at(1)'。第一個只會在調試編譯時檢查,但會增加一定的理智。第二個將檢查調試和發佈版本,但會有一些額外的開銷。就目前而言,對我來說,這段代碼是虛假分段錯誤的一個祕訣。此外,矢量矢量傾向於厭惡糟糕的設計,應該仔細考慮。 – 2010-06-07 23:38:02

+0

@Nathan Sanity檢查是真正的代碼必須的,但這不應該是生產代碼:)。無論如何,我根據您的建議更改了代碼。 – AraK 2010-06-07 23:43:14

+0

歡呼聲。我只是害怕從答案中複製/粘貼太多到真正的代碼,所以我覺得我們必須是迂腐的。你已經贏得了我的+1。 – 2010-06-07 23:50:52

1

這就像一個字符串的矢量,除了不是一串字符,我們有一串數字。我想你想要這樣的:

[ 
    [1, 0, 4], 
    [4, 9, 9], 
    [0, 1, 9], 
    [4, 5. 2] 
] 

...排序來......

[ 
    [0, 1, 9], 
    [1, 0, 4], 
    [4, 5. 2], 
    [4, 9, 9] 
] 

...對不對?

爲此,您需要編寫一個比較類或函數,它需要兩個數字向量,如果第一個數小於第二個,則返回「true」。像:

bool my_comparator(const std::vector<double> &a, const std::vector<double> &b) 
{ 
    // return true if a < b ... by comparing a[0] with b[0], etc. 
} 

然後傳遞排序():

sort(?, ?, my_comparator); 
相關問題