Per § 25,4/3 (Schwerpunkt und Fussnoten sind von mir):
Für andere Algorithmen als die in 25.4.3 beschrieben * richtig funktioniert, comp ** muss eine strikt schwache Bestellung auf die Werte induzieren.
* 25.4.3 ist der Abschnitt für binäre Suchalgorithmen.
**comp
ist der benutzerdefinierte Komparator.
Da std::sort
in 25.4.1 definiert und std::min_element
ist in 25.4.7, dann brauchen Sie nur eine strenge schwache Ordnung auf den Werten, das heißt:
Der Begriff streng das bezieht sich Anforderung einer irreflexiven Beziehung (! comp (x, x) für alle x) und der Begriff schwach für Anforderungen, die nicht so stark sind wie für eine Gesamtordnung, aber stärker als diejenigen für eine partielle Ordnung. Wenn wir Äquiv (a, b) als! Comp (a, b) & &! Comp (b, a) definieren, dann sind die Anforderungen, dass comp und equiv beide transitive Relationen sein müssen:
(4.1) - comp (a, b) & & comp (b, c) impliziert comp (a, c)
(4.2) - equiv (a, b) & & equiv (b, c) impliziert equiv (a, c)
Soweit ich Ihre Beziehung zu verstehen, ist es nicht die equiv Anforderung überein, da Sie kann habe zwei Knoten, wo !comp(a, b) && !comp(b, a)
, aber a != b
. Wenn Sie a
und c
auf einem Zweig und b
auf einem anderen Zweig haben, funktioniert das obige normalerweise nicht, weil equiv(a, b) == equiv(b, c) == true
aber equiv(a, c) == false
.
Eine Teilbestellung reicht nicht aus, um 'std :: min_element' und' std :: sort' nach dem Standard zu verwenden, aber eine Gesamtbestellung ist nicht erforderlich, was Sie brauchen, ist eine strenge schwache Bestellung - Siehe Antwort für mehr Details und Zitate aus dem Standard. – Holt