Как связать лямбды для алгоритмов STL с многомерными массивами в стиле C?

Я пытался использовать алгоритмы STL для работы с элементами многомерных массивов, и, похоже, к ним ничего не привязано. Как мне это сделать:

// Declaration of pix:
float pix[1000][2];

// (...)

const int sizeToParse = 300;
static auto colLessThan = [] 
    (const float coordPair_lhs[2], const float coordPair_rhs[2]) -> bool 
    // (const float** coordPair_lhs, const float** coordPair_rhs) -> bool 
    // (const float* coordPair_lhs[], const float* coordPair_rhs[]) -> bool 
{
    return coordPair_lhs[1] < coordPair_rhs[1]; 
};
float** lhsColMinIt;
float** lhsColMaxIt;
// float* lhsColMinIt[2];
// float* lhsColMaxIt[2];
std::tie(lhsColMinIt, lhsColMaxIt) = std::minmax_element(pix, pix + sizeToParse, colLessThan);

Все мои попытки отклоняются с ошибкой компилятора.

После принятого ответа он сократился до этого:

В экземпляре 'std::tuple‹_T1, _T2>& std::tuple‹_T1, _T2>::operator=(std::pair‹_U1, _U2>&&) [с _U1 = const float () [2]; _U2 = константа с плавающей запятой ()[2]; _T1 = число с плавающей запятой (&)[2]; _T2 = float (&)[2]]':src/ClusterPairFunctions.cc:32:109: требуется отсюда /data/hunyadi/usr/include/c++/7.1.0/tuple:1252:25: ошибка: неверное преобразование из 'const float () [2]' в 'float ()[2]' [-fpermissive]

Обновление: Используя метод, предоставленный принятым ответом, код работает, мне просто не удалось понять, что компилятор сообщает о некорректности константы внутри std::tuple.


person Adam Hunyadi    schedule 29.06.2017    source источник
comment
Не могли бы вы уточнить проблему, с которой вы столкнулись с кодом, который вы показываете? Не строит? У вас бывают сбои? Неожиданные результаты? Что-то другое?   -  person Some programmer dude    schedule 29.06.2017
comment
Также, пожалуйста, опубликуйте MVCE, чтобы дать возможность воспроизвести проблему.   -  person skypjack    schedule 29.06.2017
comment
Ничего больше не зная (поскольку вы не показываете нам ошибку компилятора), я предполагаю, что это как-то связано с несоответствием типов. Аргументы лямбда — это указатели на float (т. е. float*), но элементы массива pix — это массивы двух float, т. е. тип float[2]. Решение показано в ответе Jarod42.   -  person Some programmer dude    schedule 29.06.2017
comment
Другая проблема (также решенная с помощью ответа от Jarod42) заключается в том, что указатель на указатель на некоторый тип не то же, что и массив массивов типа.   -  person Some programmer dude    schedule 29.06.2017


Ответы (1)


В C++14 используйте const auto& в лямбде.

Если вам нужно указать тип явно:

static auto colLessThan = [] (const float (&lhs)[2], const float (&rhs)[2])
{
    return lhs[1] < rhs[1];
};

float (*lhsColMinIt)[2];
float (*lhsColMaxIt)[2];
std::tie(lhsColMinIt, lhsColMaxIt) =
    std::minmax_element(pix, pix + sizeToParse, colLessThan);

Демо

person Jarod42    schedule 29.06.2017
comment
Возможно, вы могли бы немного подробнее рассказать о внесенных вами изменениях и почему вы их сделали? - person Some programmer dude; 29.06.2017
comment
Я подтвердил, что это действительно работает, мой код по-прежнему отказывается компилироваться с ним :( - person Adam Hunyadi; 29.06.2017