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.
#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.
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.