Assoziative Container in der STL

Martin Kompf

Die wichtigste Ergänzung des neuen C++ Standards ist die Standard Template Library (STL).

Die Möglichkeit, durch einen Schlüssel adressierte Werte in einer Tabelle zu speichern und über den Schlüssel auf die Werte zuzugreifen - sogenannte assoziative Container - wird oft in Programmen benötigt. Die Sprache C++ besitzt dafür keine eingebaute Möglichkeit. Jedoch bietet die STL mittels der Templates für Maps und Multimaps eine hervorragende Lösung an.

Ein Beispiel (die Zeilennummern gehören natürlich nicht zum Code, sondern dienen nur der nachfolgenden Erläuterung):

/*  1 */  #include <iostream>
/*  2 */  #include <map>
/*  3 */  #include <string>
/*  4 */  using namespace std;
/*  5 */
/*  6 */  int main( int argc, char **argv)
/*  7 */  {
/*  8 */      map<const string, double> kurse;
/*  9 */      map<const string, double>::iterator el;
/* 10 */
/* 11 */      kurse[ "BAS"] = 48.89;
/* 12 */      kurse[ "BAY"] = 45.10;
/* 13 */      kurse[ "DTE"] = 84.20;
/* 14 */
/* 15 */      cout << "enter stock symbol ( ";
/* 16 */      for (el = kurse.begin(); el != kurse.end(); ++el) {
/* 17 */          cout << el->first << " ";
/* 18 */      }
/* 19 */      cout << ") : " << flush;
/* 20 */
/* 21 */      string sym;
/* 22 */      cin >> sym;
/* 23 */      el = kurse.find( sym);
/* 24 */
/* 25 */      if (el != kurse.end()) {
/* 26 */          cout << "value is " << el->second << endl;
/* 27 */      }
/* 28 */      else {
/* 29 */          cout << "no value for symbol " << sym << endl;
/* 30 */      }
/* 31 */  }

Dieses Demonstrationsprogramm speichert Kurssymbole und den dazugehörigen Kurswert in einer Map. Der Benutzer wird zur Eingabe eines Kurssymbols aufgefordert, das Programm gibt dann den entsprechenden Kurswert dafür aus.

In den Zeilen 1 bis 3 erfolgt das Einbinden der notwendigen STL- und iostream-Include-Dateien. In Zeile 8 wird die Map deklariert. Dazu wird ein Template aus der STL verwendet, welches ein Objekt mit Namen kurse erzeugt, bei dem der Schlüssel vom Typ string (für das Kurssymbol) und der Wert vom Typ double (für den Kurswert) ist. In Zeile 9 wird ebenfalls mittels eines Templates gleich noch ein Iterator für das Objekt kurse erzeugt. Dieser Iterator wird später für den Zugriff auf einzelne Schlüssel-Wert-Paare benötigt.

In den Zeilen 11 bis 13 wird die Map kurse mit einigen Werten bestückt.

In den Zeilen 15 bis 19 wird der Benutzer zur Eingabe eines Kurssymbols aufgefordert. Als Hilfestellung werden dabei alle in der Map enthaltenen Symbole (d.h. alle Schlüssel) ausgegeben. Dies passiert durch Benutzung des Iterators und der Funktionen begin() und end() in Zeile 16, die Zeiger auf das erste und hinter das letzte Schlüssel-Wert-Paar der Map zurückliefern. Der Schlüssel eines Paares wird durch den Iteratormember first angesprochen (Zeile 17).

In den Zeilen 21 bis 23 erfolgt nun das Lesen der Eingabe und das Suchen des durch den Schlüssel sym adressierten Elements in der Map. Die Funktion find (Zeile 23) liefert dabei entweder das erste gefundene Schlüssel-Wert-Paar oder kurse.end() zurück, falls der Schlüssel nicht in der Map enthalten war. Diese Tatsache wird bei der Ausgabe ausgewertet, wobei der Zugriff auf den Wert eines Paares jetzt mit dem Iteratormember second (Zeile 26) erfolgt.

Eine Map erlaubt nur das einmalige Vorkommen eines Schlüssels. Soll es zu einem Schlüssel dagegen mehrere Werte geben dürfen (beispielsweise Eröffnungs- und Schlußkurs je Kurssymbol), so kann hierfür das Template multimap aus der STL verwendet werden. Als weiterführende Informationsquelle eignet sich das STL Programmer´s Guide von SGI.