C++ Kurs

Standard Hilfstemplates

Die Themen:

Sehen wir uns zum Eingewöhnen in die Standard-Bibliothek noch einige einfache Funktions- und Klassen-Templates an.

min<>, max<> und swap<>

min<>, max<>

Zum Ermitteln des kleinsten bzw. größten Wertes aus zwei Werten stellt die Standard-Bibliothek die Funktions-Templates min(...) bzw. max(...) zur Verfügung, welche in der Header-Datei <algorithm> definiert sind. Wie alle Standard-Bibliothek Komponenten liegen min(...) und  max(...) im Namensraum std.

PgmHeadershort sval1, sval2;
...
auto smin = std::min(sval1, sval2);
...
double dval;
...
auto dmax = std::max(dval1, 10.0);

Beide Funktions-Templates können auch eingesetzt werden, um das 'kleinste' bzw. 'größte' Objekt von zwei Objekten zu ermittelt. 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 wiederum die beiden Operatoren < und == durch entsprechende friend-Funktionen überladen, sowie für die Rückgabe des Ergebnisses eventuell den Kopierkonstruktor und den überladenen Operator = definieren.

PgmHeader#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
auto resObj = std::min(obj1, obj2);

swap<>

Zum Vertauschen von zwei Werten oder Objekten enthält die Standard-Bibliothek das Funktions-Template swap(...). Beim Vertauschen von Objekten ist zu beachten, dass hierbei ein neues temporäres Objekt erstellt wird und auch Zuweisungen stattfinden. Es sollten also die entsprechenden Move-Memberfunktionen definiert sein.

PgmHeaderint val1, val2;
Window win1(...), win2(...);
...
std::swap(val1,val2);
std::swap(win1,win2);

numeric_limits<>

Einer der meist genannten Kritikpunkte an der Sprache C++ betrifft die plattformabhängige Darstellung von numerischen Werten. So kann es durch aus sein, 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 die Template-Klasse numeric_limits zur Verfügung. Auch diese Klasse liegt 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.

PgmHeader#include <limits>
// maximaler Wert eines ints
std::cout << std::numeric_limits<int>::max() << std::endl;
// Rundungsfehler eines float-Werts
std::cout << std::numeric_limits<float>::round_error() << std::endl;

Die nachfolgende Aufstellung enthält eine Übersicht über die wichtigsten, durch numeric_limits zur Verfügung gestellten, Eigenschaften für numerische Datentypen. Dabei ist zu beachten, dass einige Eigenschaften als Zahlenwerte vorliegen während andere Eigenschaften über entsprechenden Memberfunktionen ermittelt werden.

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 negative Zahl zur Folge haben.

int digits10

Anzahl der Dezimalstellen die verwendet werden. Wenn ein Wert digits10+1 Dezimalstellen belegt, kann bei weiteren Rechenoperationen ein Fehler 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. Mit Hilfe 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 nächsten von 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.