2011-04-18 79 views
1

我想從STL中使用排序功能,但它在執行過程中給我一個錯誤。功能排序錯誤

我比較功能,如果v是小然後按e返回true:

bool smallerThan(VertexEntry &v, VertexEntry &e) { 
    if(v.v[0] < e.v[0]) return true; 
    else if(v.v[1] < e.v[1]) return true; 
    else if(v.v[2] < e.v[2]) return true; 
    return false; 
} 

,這裏是電話:

sort(vertices.begin(),vertices.end(),smallerThan); 

向量的大小是aprox的400元。

有人能幫我解決我的問題嗎? 謝謝!

+0

或許,如果你張貼的錯誤,我們可以提供幫助。 – 2011-04-18 16:37:30

+0

什麼是錯誤? – 2011-04-18 16:37:38

+0

你得到了哪一個確切的錯誤? – ulidtko 2011-04-18 16:38:16

回答

9

您的比較函數是不正確的 - 它不強制執行嚴格的弱排序。

使用此:

bool smallerThan(VertexEntry const & v, VertexEntry const & e) { 
    if (v.v[0] < e.v[0]) 
    return true; 
    else if(v.v[0] > e.v[0]) 
    return false; 
    else if(v.v[1] < e.v[1]) 
    return true; 
    else if(v.v[1] > e.v[1]) 
    return false; 
    else if(v.v[2] < e.v[2]) 
    return true; 
    return false; 
} 
+1

最好避免使用'>'運算符,因爲當<<'時它通常不會被重載。 – Potatoswatter 2011-04-18 16:38:33

+2

@Patatoswatter:我認爲最好是實現你所需要的操作符,或許是'operator <'。對於一個模板肯定,對於一個特定的類,我更喜歡上述。 – Erik 2011-04-18 16:40:14

+0

@ybungalobill,@Erik:每次實施所有操作員都很方便,但這是一項不切實際的工作。如果你真的這麼做了,那麼給你更多的權力。在這種情況下,'operator>'不是*必需的*。 – Potatoswatter 2011-04-18 16:44:25

2

您的比較操作人員不嚴格執行弱序。如果你能夠使用提升技巧,我所看到的就是將你的對象綁定到boost::tuple並使用它的嚴格弱operator<

如果你需要自己編寫,這樣的事情應該工作:

bool smallerThan(const VertexEntry &v, const VertexEntry &e) 
{ 
    if(v.v[0] != e.v[0]) return v.v[0] < e.v[0]; 
    else if(v.v[1] != e.v[1]) return v.v[1] != e.v[1]; 
    else return v.v[2] < e.v[2]; 
}