Подскажите что означает эта строка?
#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; });
Компаратор, сиречь функция, которая обеспечивает настройку сортировки. Она заменяет стандартное отношение "a меньше b" на пользовательское.
В данном случае a "меньше" b, если a не меньше нуля, а b меньше. Т.е. сначала идут положительные числа, а потом отрицательные.
Но мне этот компаратор не нравится — нет строгого отношения "меньше"... Так что вообще говоря, результаты могут быть несколько неожиданными :)
Это лямбда выражение. Если записать это в виде "нормальных" функций:
bool f(const auto& a, const auto& b)
{
return a >= 0 && b < 0;
}