Подскажите что означает эта строка?

#include <iostream>
#include <algorithm>

int main()
{
    int m[] = { 5, -2, 3, -3, 8, -1, 0 }; /// 0  положительное мнж

    std::sort(std::begin(m), std::end(m),
        [](const auto& a, const auto& b) { return a >= 0 && b < 0; }); 

    for (const auto& e : m) std::cout << e << ", ";
}

[](const auto& a, const auto& b) {return a >= 0 && b < 0; } // вот эта строчка?


Ответы (3 шт):

Автор решения: ТарасПрогер

Это третий доп. параметр, который указывает порядок сортировки. Этот параметр может быть лямбдой (как в данном примере) или функцией, которые принимают два параметра. Каждый раз std::sort посылает в эту лямбду два значение из контейнера, дальше идет логическое выражение, которое даст true или false. Если выражение истинно, эти значения меняются местами, иначе - ничего не происходит. Что интересно, так этот вызов std::sort просто переносит отрицательные значение в конец. Это можно заменить на более элегантную конструкцию:

std::partition(std::begin(m), std::end(m), [](const auto& a) { return a >= 0; });
→ Ссылка
Автор решения: Harry

Компаратор, сиречь функция, которая обеспечивает настройку сортировки. Она заменяет стандартное отношение "a меньше b" на пользовательское.

В данном случае a "меньше" b, если a не меньше нуля, а b меньше. Т.е. сначала идут положительные числа, а потом отрицательные.

Но мне этот компаратор не нравится — нет строгого отношения "меньше"... Так что вообще говоря, результаты могут быть несколько неожиданными :)

→ Ссылка
Автор решения: n1tr0xs

Это лямбда выражение. Если записать это в виде "нормальных" функций:

bool f(const auto& a, const auto& b)
{
    return a >= 0 && b < 0; 
}
→ Ссылка