我想获得一个基于 vector 的有序索引值(以后我将使用该索引对另一个 vector 进行排序)。以下代码适用于我的目的:
std::vector<int> order_ideal(std::vector<double> x) {
std::vector<int> idx(x.size());
std::iota(idx.begin(), idx.end(), 0);
std::sort(idx.begin(), idx.end(), [&](int i, int j){return x[i] > x[j];});
return idx;
}
但是,lambda函数不能在早期版本的GCC编译器中使用,因此我正在寻找另一种无需使用lambda函数即可实现此代码的方法。我真的很喜欢[&]
如何捕获外部环境变量。换句话说,我想在x
的比较函数中使用外部环境中的std::sort()
。另外,我可以进行以下工作,但是在我的计算机上它的速度比上述功能慢六倍(并且我还没有检查它是否与较早的GCC版本兼容):
bool isGreater(int i, int j, std::vector<double> x)
{
return x[i] > x[j];
}
std::vector<int> order_bind(std::vector<double> x)
{
std::vector<int> idx(x.size());
std::iota(idx.begin(), idx.end(), 0);
std::sort(idx.begin(), idx.end(), std::bind(isGreater, std::placeholders::_1, std::placeholders::_2, x));
return idx;
}
我有点理解,我需要像解释的here一样绑定(bind)这两个 vector (idx
和x
)。但是在这种情况下,我无法实现它。 最佳答案
捕获lambda的“自己动手”版本是一个对象,它可以手动捕获所需的变量,并公开仿函数来完成实际工作,如下所示(请注意,我还纠正了Sam提出的问题):
class Compare
{
public:
Compare (const std::vector<double> &v) : m_v (v) {}
bool operator () (int i, int j) const { return m_v [i] < m_v [j]; }
private:
const std::vector<double> &m_v;
};
std::vector<int> order_ideal(const std::vector<double>& x) {
std::vector<int> idx(x.size());
std::iota(idx.begin(), idx.end(), 0);
Compare c (x);
std::sort(idx.begin(), idx.end(), c);
return idx;
}
Live demo