我正在尝试Eigen
VectorXf
x
按升序排序.
这按降序排序:
std::sort(x.data(),x.data()+x.size());
Run Code Online (Sandbox Code Playgroud)
这不起作用:
bool myfunction (int i,int j) { return (i<j); }
std::sort(x.data(),x.data()+x.size(),myfunction);
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
前言
由于最初的问题被证明是一种误解,并且其中的代码已经是正确的答案,所以我决定写一些关于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());
Run Code Online (Sandbox Code Playgroud)
根据FooSorter
s中定义的标准,这将对vec表示的整个范围进行排序operator()
.
因为为简单事物编写自定义仿函数(按降序排序,按升序排序)会很快变得痛苦,STL提供了许多模板函数,可以在函数头中使用.与排序相关的一个是:
std::equal_to
实现x == y
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>());
Run Code Online (Sandbox Code Playgroud)
这将按向量按降序对矢量表示的范围进行排序.
但是,由于STL算法的一个最大问题是定义仿函数的痛苦,C++ 11带来了一个新技巧:lambda函数.这允许您声明函数对象等效内联.示例如下:
std::sort(begin(vec), end(vec), [](int lhs, int rhs){return rhs > lhs});
Run Code Online (Sandbox Code Playgroud)
这也会按照降序对vector表示的范围进行排序,但我们不必显式声明一个仿函数(或者使用已经声明的仿函数).(当实现更复杂的比较或不同STL算法的仿函数时,这会变得更好.)
归档时间: |
|
查看次数: |
9214 次 |
最近记录: |