2.9.2. Wenn Minimum oder Maximum unbekannt sind (Klasse d_int_set)

Lernziele

Die Klasse d_int_set

Um die Klasse int_set verwenden zu können, müssen wir Maximum und Minimum der zu speichernden Zahlen im Voraus kennen. Es gibt aber Situationen, in denen dies nicht möglich ist, oder in denen eine Berechnung zu viel Aufwand bedeuten würde. In diesen Fällen ist die Klasse d_int_set von Vorteil. Sie erweitert ihren zugrunde liegenden Bitvektor selbsttätig, wenn sich das Minimum oder das Maximum ändert. Bei der Definition müssen diese also nicht angegeben werden.

Angenommen, es ist nicht möglich, die Datei SomeInts.txt aus dem vorigen Programmbeispiel zweimal zu lesen. Wir müssen also mit einem Durchlauf über die Zahlen auskommen. Das bedeutet, dass wir nicht in einem ersten Schritt Minimum und Maximum bestimmen können, um danach die Zahlen in ein entsprechend großes int_set einzufügen. Daher benutzen wir ein d_int_set, in das wir jede gelesene Zahl beim ersten Lesen sofort abspeichern. Treffen wir dabei auf ein neues Minimum oder Maximum, so ist diese Klasse klug genug, um ihr Intervall selbst anzupassen.

Filename: FastIntegerSortDynamic.C
#include <LEDA/d_int_set.h>
#include <fstream>
#include <iostream>

using leda::d_int_set;

int main()
{
  std::ifstream is("Data/SomeInts.txt");

  int n;

  d_int_set S;
  
  while (is >> n) 
    S.insert(n);
  
  for(int i = S.min(); i <= S.max(); i++)
    if(S.member(i))
      std::cout << i << "\n";  
}

Im Gegensatz zur Klasse int_set benötigt der Konstruktor von d_int_set keine Angabe von Minimum und Maximum:

d_int_set S;

Die Klasse d_int_set besitzt genau dieselbe, mächtige Schnittstelle wie die Klasse set und gleichzeitig die Effizienz der Klasse int_set. Damit lassen sich also die Vorteile beider Klassen verbinden, wenn ganze Zahlen abgespeichert werden müssen.

Weitere Informationen

Die Klasse d_int_set ist wie die Klasse int_set durch Bitvektoren von C++ implementiert. Die Laufzeiten der einzelnen Operationen sind dieselben wie die der Klasse int_set.

Mehr Informationen zur Klasse d_int_set findet man auf der entsprechenden Manualseite.