Почему ваша первая попытка не удалась? Давайте возьмем конкретный пример, сосредоточимся на этом сравнении и попытаемся объяснить, почему это недопустимо, выполнив простой тест.
Вот два вектора лиги в качестве примера:
std::vector<std::vector<unsigned int>> league_vector = {{1,2,3,4}, {2,3,4,5}, {4,5,6,7}};
Теперь дайте это std::sort
:
std::sort(league_vector.begin(), league_vector.end(),
[](const std::vector<unsigned int>& a,
const std::vector<unsigned int>& b) {return a[0] == b[0] && a[2] < b[2];});
Сконцентрируйтесь на этом:
a[0] == b[0]
Итак, скажем, std::sort
дает ваше сравнение первых двух векторов в league_vector
в этом порядке
a={1,2,3,4} b={2,3,4,5}
Ваша функция сравнения вернет false
, начиная с a[0] != b[0]
.
Тогда что если компилятор переключится и даст вам это сразу после этого, просто чтобы проверить, не является ли ваша функция неоднозначной:
a={2,3,4,5} b={1,2,3,4}
Другими словами, простое переключение значений. Вы снова возвращаете false
с a[0] != b[0]
.
Как это может иметь смысл, когда вы говорите, что в первом тесте a
должно идти после b
, а во втором тесте с только что переключенными значениями, a
должно идти после b
?
Алгоритм сортировки оправданно запутывается и помещает значения в неортодоксальный порядок.
Обратите внимание, что компилятор Visual Studio выполняет этот тест, который я описал, где функция сравнения задается a
и b
, проверяется возвращаемое значение, а затем b
и a
и проверяется возвращаемое значение. Если есть несоответствие, как указано, среда выполнения отладки устанавливает условие «недопустимое сравнение» (или подобное).