Вы не объяснили, как вы хотите отсортировать тройки, поэтому я могу лишь сказать, что ваши ожидания неверны.
Ваша функция сравнения считает, что последние три элемента равны.
Тройной (x0,x1,x2)
считается меньше, чем другой тройной (y0,y1,y2)
, если x0 < y0
и x1 < y1
. Например, при сравнении (6,4,7)
и (6,5,4)
ни одна тройка не считается меньшей, чем другая, поскольку первое число в каждой тройке одинаково (6 < 6
равно false). Точно так же (5,4,6)
считается равным (6,4,7)
, потому что ни один не меньше другого (4 < 4
ложно).
Единственное, что вы можете разумно ожидать, это (5,4,6) < (6,5,4)
, но ваша функция сравнения также говорит, что оба они равны (6,4,7)
. Другими словами, функция утверждает, что существуют значения a
, b
, c
, где a = b
и b = c
, но a < c
. Это не имеет смысла, поэтому ваша функция сравнения не работает.
Если вам нужен только лексикографический порядок, вам не нужно делать ничего особенного :
std::sort(vec.begin(), vec.end());
std::pair
сортирует по первому компоненту первым; если они равны, сравниваются вторые компоненты. Кажется, это именно то поведение, которое вы ожидаете.