我正在嘗試按升序排序Eigen
VectorXf
x
。排序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);
什麼想法?
我正在嘗試按升序排序Eigen
VectorXf
x
。排序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);
什麼想法?
前言
由於原來的問題竟然是一個誤會,並在它的代碼已經是正確的答案,我決定寫起來,並張貼有關一般使用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());
這將根據在FooSorter
的operator()
定義的標準排序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算法實現更復雜的比較或函子時,這會變得更好。)
沒有對不起,我錯了他們都沒有工作... – user189035
@ user189035你有什麼錯誤?矢量內的成員是什麼類型?給我更多的信息。 – Xarn
其實正確的答案只是std :: sort(x.data(),x.data()+ x.size())。我之前就知道這一點,但一段時間後還沒有使用過CPP並忘記了。它回到了火車上。無論如何,如果你改變你的答案,我會很樂意接受。 – user189035
試試lambda? ;-)'x.data()+ x.size(),[](int a,int b){return a> b})'...或者只發送'std :: greater()'。或排序後的「反向」。或... –
Xarn
做到了!謝謝。 – user189035
好的,我會把它寫成答案,以便能夠回答。 – Xarn