Ссылка для operator<
из std::pair<int, int>
говорит о том, что она
Сравнивает lhs и rhs лексикографически оператором <, то есть сравнивает первые элементы и только если они эквивалентны, сравнивают вторые элементы. </p>
Таким образом, оба элемента используются для сравнения std::pair
, и вы видите, что это полностью отсортированный вектор. Относительный порядок элементов будет иметь значение только тогда, когда два или более элементов могут считаться равными. Поскольку оба значения пар используются для сравнения, ни одно из них нельзя считать равным. Таким образом, относительный порядок здесь не имеет значения.
Вы можете использовать собственный компаратор для сравнения только первого элемента:
stable_sort(v.begin(), v.end(), [](const auto& a, const auto& b) {return a.first < b.first; });
An будет видеть вывод
[1, 3] [1, 1] [2, 19] [2, 4]
Здесь первые две и две последние пары считаются равными и сохраняют их относительный порядок.