Zum Ermitteln des kleinsten bzw. größten Wertes aus zwei Werten stellt die Standard Bibliothek die beiden Funktions-Templates min(...) und max(...) zur Verfügung. Wenn Sie diese Funktions-Templates verwenden, müssen Sie die Header-Datei <algorithm> einbinden. Wie alle Standard Bibliothek Komponenten liegen min(...), max(...), und auch das gleich noch behandelte Funktions-Template swap(...), im Namensraum std.
min(...) bzw. max(...) können zum einen zur Ermittlung des kleinsten bzw. größten Werts aus Standard-Datentypen verwendet werden. Hierbei spielt es dann keine Rolle, ob Sie Variablen (1. Beispiel) oder Konstanten vergleichen (2. Beispiel).
short sval1, sval2; ... short smin = std::min(sval1, sval2); ... double dval; ... double dmax = std::max(dval1, 10.0); |
Außer einfachen Datentypen können Sie aber auch das 'kleinste' bzw. 'größte' Objekt von zwei Objekten ermitteln. Es versteht sich von selbst, dass hierbei die beiden zu vergleichenden Objekte vom gleichen Typ sein müssen.
Die Klasse der zu vergleichenden Objekte muss für den Vergleich die
beiden Operatoren < und == durch friend-Funktionen
überladen, so wie für die Rückgabe des Ergebnisses eventuell den
Kopierkonstruktor und den überladenen Operator =
definieren.
#include <algorithm>
#include <utility>
using namespace std::rel_ops;
class Any
{
...
friend bool operator < (const Any& lhs, const Any& rhs);
friend bool operator == (const Any& lhs, const Any& rhs);
};
... // friend-Funktionen definieren
...
Any obj1(...), obj2(...);
...
// 'Kleinstes' Objekt zurückliefern
Any resObj = std::min(obj1, obj2);
|
Zum Vertauschen von zwei Werten oder Objekten enthält die Standard Bibliothek das Funktions-Template swap(...). Beachten Sie beim Vertauschen von Objekten, dass hier Zuweisungen stattfinden und je nach Eigenschaften der zu vertauschenden Objekte der Zuweisungsoperator überladen werden sollte (Stichwort: dynamische Eigenschaften und eingeschlossene Objekte).
int val1, val2; Window win1(...), win2(...); ... std::swap(val1,val2); std::swap(win1,win2); |
Einer der am meist genannten Kritikpunkte an der Sprache C++ betrifft die plattformabhängige Darstellung von numerischen Werten. So kann es durch aus einmal passieren, dass auf einem System ein int-Wert 16-Bit belegt und auf einem anderen 32-Bit oder gar 64 Bit. Damit aber zur Programmlaufzeit die Kenndaten von numerischen Werten ermittelt werden können, stellt die Standard Bibliothek Template-Klassen vom Typ numeric_limits zur Verfügung. Auch diese Klassen liegen im Namensraum std und bei ihrer Verwendung muss die Headerdatei <limits> eingebunden werden.
Um eine bestimmte 'Eigenschaft' eines numerischen Datentyps zu bestimmen, wird zuerst der Klassenname numeric_limits angegeben und danach in spitzen Klammern der Datentyp, dessen Eigenschaft ermittelt werden soll. Im Anschluss daran folgt der Gültigkeitsbereichsoperator :: und danach der Name der zu ermittelnden Eigenschaft.
#include <limits> // maximaler Wert eines ints std::numeric_limits<int>::max(); // Rundungsfehler eines float-Werts std::numeric_limits<float>::round_error(); |
Beachten Sie in der nachfolgenden Aufstellung der Eigenschaften, dass einige Eigenschaften als Zahlenwerte vorliegen während andere über entsprechenden Memberfunktionen ermittelt werden. Die Tabelle enthält eines Übersicht über die wichtigsten, durch numeric_limits zur Verfügung gestellten, Eigenschaften für numerische Datentypen.
|
bool is_specialized |
Für den Datentyp gibt es weitere Kenndaten in numeric_limits. Nur wenn diese Eigenschaft true ist gelten auch die folgenden Kenndaten. |
|
bool is_modulo |
Operationen auf den Datentyp können zum Überlauf führen. So kann eine Addition von zwei positiven Zahlen als Ergebnis eine negativ Zahl zur Folge haben. |
|
int digits10 |
Anzahl der Dezimalstellen die immer gültig sind. Bei digits10+1 Dezimalstellen kann bei weiteren Rechenoperationen ein Rechenfehler auftreten. Beim Datentyp short ist digits10 z.B. 4, d.h. erst wenn ein short-Wert 5 Stellen besitzt kann zum Beispiel ein Überlauf auftreten. Mithilfe des digits10+1 Wertes können Sie zum Beispiel mittels setprecision die max. Anzahl der auszugebenden Stellen festlegen. Beim short-Datentyp wären dies dann 5 Stellen. |
|
min( ) |
Liefert den kleinsten Wert des Datentyps zurück. |
|
max( ) |
Liefert den größten Wert des Datentyps zurück. |
|
epsilon( ) |
Nur für Gleitkommazahlen; liefert den kleinsten von größer 1.0 abweichenden Wert und ist damit auch ein Maß für die Genauigkeit der Gleitkommazahl. |
Es gibt noch eine ganze Reihe weiterer Eigenschaften die in numeric_limits spezifiziert sind. Sehen Sie dazu bitte in der Online-Hilfe zu Ihrem Compiler nach.