2014-02-17 56 views
6

我正在嘗試按升序排序EigenVectorXfx排序eigen vectorXf升序

此排序,按降序排列:

std::sort(x.data(),x.data()+x.size()); 

,這不起作用:

bool myfunction (int i,int j) { return (i<j); } 
std::sort(x.data(),x.data()+x.size(),myfunction); 

什麼想法?

+1

試試lambda? ;-)'x.data()+ x.size(),[](int a,int b){return a> b})'...或者只發送'std :: greater ()'。或排序後的「反向」。或... – Xarn

+0

做到了!謝謝。 – user189035

+0

好的,我會把它寫成答案,以便能夠回答。 – Xarn

回答

6

前言
由於原來的問題竟然是一個誤會,並在它的代碼已經是正確的答案,我決定寫起來,並張貼有關一般使用std::sort一點。

std::sort排序範圍按照元素的弱排序定義的升序排列。默認情況下,它使用在元素上定義的運算符<,但也可以使用函數對象或函數來提供比較。這個仿函數需要有bool operator()(const T& lhs, const T& rhs) const的簽名才能正確地重載函數。這樣的一個例子如下:

struct FooSorter { 
    bool operator (const Foo& lhs, const Foo& rhs) const { 
     return lhs.ham_index < rhs.ham_index; 
    } 
}; 
/* ... */ 
std::sort(begin(vec), end(vec), FooSorter()); 

這將根據在FooSorteroperator()定義的標準排序VEC表示的全範圍。因爲爲簡單的事情編寫自定義函數(按降序排列,按升序排序)會很快變得痛苦,STL提供了許多模板函數,可以在functional頭文件中使用。有關排序的一個是:

  • std::equal_to實施X ==Ÿ

  • std::not_equal_to實施X = Y

  • std::greater實現X> Y

  • std::less實施X <! y

  • std::greater_equal實現X> = Y

  • std::less_equal實施X < = Y

所有這些都模板和可用於任何類型的,實現所需的運算符。使用這些易:

std::sort(begin(vec), end(vec), std::greater<int>()); 

這將排序向量以降序表示的範圍。但是,由於STL算法最大的問題之一是定義函數的痛苦,C++ 11帶來了一個新的訣竅:lambda functions。這可以讓你聲明等效的函數對象。舉例如下:

std::sort(begin(vec), end(vec), [](int lhs, int rhs){return rhs > lhs}); 

這也將要按降序排序由向量表示的範圍,但我們並沒有顯式聲明函子(或使用已經宣告一個)。 (當爲不同的STL算法實現更復雜的比較或函子時,這會變得更好。)

+0

沒有對不起,我錯了他們都沒有工作... – user189035

+0

@ user189035你有什麼錯誤?矢量內的成員是什麼類型?給我更多的信息。 – Xarn

+0

其實正確的答案只是std :: sort(x.data(),x.data()+ x.size())。我之前就知道這一點,但一段時間後還沒有使用過CPP並忘記了。它回到了火車上。無論如何,如果你改變你的答案,我會很樂意接受。 – user189035