我想获得一个基于 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 (idxx)。但是在这种情况下,我无法实现它。

最佳答案

捕获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

08-25 23:02
查看更多