簡體   English   中英

在沒有 lambda 函數的 C++ 中使用另一個向量對向量進行排序

[英]Sorting a vector using another vector in C++ without lambda function

我想獲得基於向量的有序索引值(稍后我將使用此索引對另一個向量進行排序)。 以下代碼適用於我的目的:

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 函數。 我真的很喜歡[&]如何捕獲外部環境變量。 換句話說,我想在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結合在一起)。 但在這種情況下我無法實現它。

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

現場演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM