2014-10-27 20 views
27

W sesji "Grill the Committee" z CppCon 2014, członek Komitetu Walter Brown wspomniał, że std :: max zwraca błędną wartość w przypadku, gdy oba argumenty mają taką samą wartość.Dlaczego std :: max zwraca nieprawidłową wartość?

Zostało to przyjęte bez komentarza i nie zostało rozwinięte. Co miał przez to na myśli? Dlaczego ma znaczenie, która wartość jest zwracana?

+1

IIRC dla niektórych argumentów porządkowych bardziej sensowne jest zwracanie drugiego argumentu w przypadku, gdy oba są równe. – juanchopanza

+0

@juanchopanza Interesujące, czy mógłbyś pokazać przykład? Dzięki! – P0W

+3

To przychodzi (jak sądzę) z "Notatek o programowaniu" Aleksandra Stiepanowa - prawdopodobnie ma tam racjonalne uzasadnienie. – Mat

Odpowiedz

32

Jeśli min i max są używane tylko w zestawach uporządkowanych, wszystkie rozsądne definicje są równoważne.

W praktyce jednak w zestawach wstępnie zamówionych używane są: min i max: zestawy, w których można uzyskać dwa elementy, które sortują to samo bez identyczności. Na przykład, można być manipulacyjny:

struct student { 
    char *name; 
    int grade; 
}; 

i zdefiniować s1 < s2 gdy strcmp(s1->name, s2->name) < 0. Następnie dwóch uczniów o tej samej nazwie, ale o różnych stopniach będzie sortować to samo. Takie dwa elementy są uważane za równoważne dla relacji (wstępnego) porządkowania.

W zbiorze przedpremierowym argumentem jest, że min dwóch równoważnych elementów powinno zwrócić pierwszy parametr, a max powinien zwrócić drugi parametr. Definicja ta zachowuje kilka właściwości, które można oczekiwać, zwłaszcza

  • para (min(x,y), max(x,y)) jest albo (x, y) lub (y, x)

i

  • jeśli x i y są różne, to min(x,y) i max(x,y) są odrębne,

i

  • funkcja, która odwzorowuje (x, y) do (min(x,y), max(x,y)) jest stabilną funkcją sortowania na zestawy dwóch elementów.

To nie jest nowy pomysł, a znajdziesz dużo lepsze wyjaśnienia niż moje w wielu standardowych tekstach dotyczących programowania. Rozdział 7 z Stepanov Papers, cytowany już przez Mat i juanchopanza, jest dobrym źródłem jeśli lubisz składnię C++.

Powiązane problemy