Sua pergunta parece se resumir a se o std::sort
de C ++ pode ou não ser usado com funções de comparação que não se comportam como o operador <
. O operador <
é um pedido estrito e fraco, não um pedido total. Qualquer contêiner ou algoritmo na biblioteca padrão C ++ que dependa do operador <
assume que ele forma um ordenamento estrito e fraco, e se você violar essa suposição, então pode haver destruição (como você viu). Então, para responder a pergunta sem rodeios no seu título, std::sort
funciona absolutamente bem com rotinas de comparação personalizadas, mas essas rotinas personalizadas devem se comportar corretamente.
Quanto a como gerar uma ordem adequada para std::sort
, dado um possível total de pedidos, tente o seguinte. Dada uma função de ordenação personalizada f
, defina uma nova função de ordenação f_weak
da seguinte forma:
template <typename T, typename F>
auto f_weak(F comparator)
{
return [comparator](T a, T b) {
return comparator(a, b) // true if a <= b
&& a != b;
};
}
e depois passar f_weak<T>(f)
como último parâmetro para std::sort
. Este código não foi testado e usa alguns recursos modernos do C ++, mas tenho certeza que você entendeu a essência dele.