Я хочу получить упорядоченные значения индекса на основе вектора (позже я буду использовать эти индексы для сортировки другого вектора). Для моих целей подходит следующий код:
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, поэтому я ищу другой способ реализовать этот код без использования лямбда-функций. Мне очень нравится, как [&]
захватывает внешние переменные среды. Другими словами, я хочу использовать 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;
}
Я отчасти понимаю, что мне нужно связать эти два вектора (idx
и x
вместе), как описано здесь а>. Но я не могу реализовать это в данном случае.
1 ответ
Версия захвата лямбда «сделай сам» - это объект, который захватывает необходимые переменные вручную и предоставляет функтор для выполнения фактической работы, что-то вроде этого (обратите внимание, что я также исправил проблему, которую поднял Сэм):
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;
}
Похожие вопросы
Новые вопросы
c++
C++ — это язык программирования общего назначения. Изначально он разрабатывался как расширение C и имел аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде, который будет скомпилирован с помощью компилятора C++. Используйте тег версии для вопросов, связанных с конкретной стандартной версией [C++11], [C++14], [C++17], [C++20] или [C++23]. и т.д.