按升序排序特征向量Xf

use*_*035 10 c++ eigen

我正在尝试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)

有任何想法吗?

Xar*_*arn 7

前言
由于最初的问题被证明是一种误解,并且其中的代码已经是正确的答案,所以我决定写一些关于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)

根据FooSorters中定义的标准,这将对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算法的仿函数时,这会变得更好.)