Функции и Лямбда выражения - C++

217
28 ноября 2017, 22:54

Доброго времени суток, дорогие форумчане! Всплыл вопрос: "Вот хочу сделать функцию и передавать ей как аргумент какое-то условие допустим i == j, функция обработки двумерного массива, и я не понимаю как мне это реализовать! И возможно ли как-то использовать для этого лямбда выражения?" Как работают последние я тоже не совсем понимаю. Все примеры что я видел используют уже имеющиеся, Стандартные функции, такие как sort() и другие. Как же сделать функцию которая сможет работать с лямбда выражениями?

Answer 1

Лямбды и иже с ними нужны там, где вы на ходу меняете поведение.

Например, функция

int accum(int * arr, int N, int init, std::function<int(int,int)> f)
{
    for(int i = 0; i < N; ++i)
        init = f(init,arr[i]);
    return init;
}

Она просто применяет некую функциональность к значениям массива (как у вас). Если это i+j - будет суммирование элементов. Если i*j - их произведение. Вот тут вместо f можно передавать ту же лямбду или функцию. Например, функция

int prod(int i, int j)
{
    return i*j;
}

умножает числа - и вот произведение всех элементов:

cout << "Mul = " << accum(a,6,1,prod) << endl;

Или

struct square
{
    int operator() (int i, int j) { return i + j*j; }
};

для суммирования квадратов:

cout << "Sq  = " << accum(a,6,0,square()) << endl;

А вот и лямбда - для суммирования элементов:

cout << "Sum = " << accum(a,6,0,[](int i, int j) { return i+j; }) << endl;

Полный пример - тут.

Answer 2

В вашем случае можно использовать указатель на функцию. Пример:

void getSumMas(var** M, int N, bool (*condition)(int, int))
{
    // здесь можно вызывать condition как обычную функцию
    if (condition(......)) { /* что-то делаете */ }
}

Вызов:

bool compare(int i, int j)
{
   return i == j  // или что угодно другое
}
getSumMas(M, N, compare)  // Имя функции является указателем на нее
READ ALSO
Нужна помощь с двумерными массивами C++

Нужна помощь с двумерными массивами C++

Нужно организовать проверку элементов двумерного массива по диагонали с рандомных координат, по аналогии с ходом коня в шахматахВот часть...

202
Ошибка &ldquo;You need to find .cpp to view the source for the current call stack frame&rdquo; при отладке

Ошибка “You need to find .cpp to view the source for the current call stack frame” при отладке

You need to find appmodulcpp to view the source for the current call stack frame

201
сравнение SIFT дескрипторов особых точек (OpenCV 3)

сравнение SIFT дескрипторов особых точек (OpenCV 3)

Буду очень признателен, если коллеги подскажут ссылку или исходник, где можно подсмотреть, как правильно добираться до значений вектора...

212