【问题标题】:Sorting a vector using another vector in C++ without lambda function在没有 lambda 函数的 C++ 中使用另一个向量对向量进行排序
【发布时间】:2020-09-26 21:45:00
【问题描述】:

我想得到一个基于向量的有序索引值(稍后我将使用这个索引对另一个向量进行排序)。以下代码适用于我的目的:

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;
}

但是,在早期版本的 GCC 编译器中不能使用 lambda 函数,所以我正在寻找另一种不使用 lambda 函数来实现此代码的方法。我真的很喜欢[&amp;] 捕获外部环境变量的方式。也就是说,我想在std::sort()的比较函数中使用来自外部环境的x

或者,我可以进行以下工作,但在我的计算机上它比上面的功能慢六倍(我还没有检查它与早期 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;
}

我有点明白我需要将这两个向量(idxx 绑定在一起)就像 here 解释的那样。但是在这种情况下我无法实现它。

【问题讨论】:

  • 也许替代函数很慢的原因是因为每次调用它时,你可怜的电脑都需要复制整个向量,无缘无故,为了传递参数?您是否尝试过通过引用传递向量参数?有关详细信息,请参阅 C++ 教科书。

标签: c++


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-19
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 2012-07-05
    相关资源
    最近更新 更多