Согласно стандарту C ++ ( 28,7 Сортировка и связанные с ней операции )
2 Сравнение - это тип функционального объекта (23.14). Возвращаемое значение
Операция вызова функции применяется к объекту типа Compare, когда
контекстно преобразуется в bool (раздел 7), возвращает true, если первый
аргумент вызова меньше второго, и ложь в противном случае.
Сравнение comp используется повсеместно для алгоритмов, предполагающих упорядочение
связь. Предполагается, что комп не будет применять какие-либо непостоянные
функция через разыменованный итератор.
Это лямбда-выражение
auto comparator([](std::string a , std::string b) {return a.length() - b.length();} );
всегда возвращает (контекстно преобразованное значение) true
, если длины двух строк неравны.
Так что для этого вектора
std::vector<std::string> v {"y" , "yyyy" , "yy" ,
"yy" , "yyyyyyy" , "yyy"};
лямбда-выражение возвращает false
для смежных элементов "yy"
и "yy"
в позиции 2
и 3
.
Если, например, вы поместите промежуточное значение между позициями 2 и 3, как, например,
std::vector<std::string> v {"y" , "yyyy" , "yy" , "y",
"yy" , "yyyyyyy" , "yyy"};
тогда первое утверждение
assert(false == std::is_sorted(v.begin() , v.end(),comparator));
терпит неудачу.
Таким образом, вам нужно правильно определить функцию сравнения. Например
auto comparator( []( const std::string &a , const std::string &b )
{
return a.length() < b.length();
} );
Также параметры лямбда-выражения должны быть константами.
Примите во внимание, что если ваш компилятор поддерживает C ++ 17, вы также можете переписать лямбда-выражение следующим образом
auto comparator( []( const std::string &a , const std::string &b )
{
return std::size( a ) < std::size( b );
} );