|
|
|
|
Programmieren mit C++Code-Beispiele & LösungenKlassen für allgemeine AufgabenKlassen für große Arrays und Vektoren
|
Zum Lieferumfang des Borland-C++-Compilers gehört die Template-Klassenbibliothek BIDS. BIDS ist die Abkürzung für Borland International Data Structures. Bei dieser Klassenbibliothek handelt es sich um die Implementierung bekannter abstrakter Datentypen. Teilweise sind die abstrakten Datentypen mit unterschiedlichen fundamentalen Datentypen implementiert. Ein Stack kann zum Beispiel als Vektor oder als Liste implementiert sein.
| Borland International Data Structures | |
Der Anwender kann für die jeweilige Situation die beste Implementierung wählen. Somit können die drei wichtigsten Kriterien berücksichtigt werden:
- Laufzeit
- Speicherbedarf
- Dimensionierungen
| Unterschiedliche Implementierungen | |
Was aber vielleicht noch wichtiger ist, durch identische Schnittstellen der abstrakten Datentypen kann ohne großen Änderungsaufwand die Implementierungsart ausgetauscht werden. Sollte sich herausstellen, daß ein Stack entgegen anfänglicher Überlegungen zur Übersetzungszeit doch nicht fest in der Größe dimensioniert werden kann, so kann die Klasse StackAsVector gegen die Klasse StackAsList getauscht werden.
| Identische Schnittstelle | |
Verwendet man die BIDS-Template-Klassen in einem Programm, das in einem 16-Bit-Speichermodell übersetzt wird, so sind die Daten des abstrakten Datentyps auf die bekannten 64 kB beschränkt. Derzeit sind 16-Bit-Programme für MS-DOS und MS-Windows 3.1 (ohne WIN32) immer noch weit verbreitet. Die geänderten Klassen umgehen dieses Problem mit Huge Zeigern. Sie machen so auch für 16-Bit-Programme Daten über 64 kB verfügbar und gestatten das Benutzen des kompletten Arbeitsspeichers.
Die Benennung ist identisch mit der Benennung der Borland-Originalklassen, es befindet sich nur zusätzlich das Wort Huge im Klassennamen.
| Beschränkung der Datengröße | |
Die Namengebung der BIDS-Template-Klassen scheint kryptisch. Hat man sich aber an die Abkürzungen gewöhnt, so erkennt man anhand des Klassennamens sofort die Fähigkeiten des abstrakten Datentyps. Folgende Abkürzungen werden verwendet:
|
Typ
|
Buchstabe
|
|
Template
|
T
|
|
Indirekt
|
I
|
|
Managed
|
M
|
|
Counted
|
C
|
|
Sortiert
|
S
|
| Namengebung | |
Der Klassenname TSHugeArrayAsVector bezeichnet ein Array, das mit dem fundamentalen Datentyp Vektor als Template-Klasse implementiert ist. Die Daten befinden sich sortiert im Array.
Der Klassenname TIHugeArrayAsVektor ist relativ ähnlich dem obigen. Der Unterschied besteht in dem zweiten Buchstaben des Klassennamens. Dieses Array ist nicht sortiert. Die Daten sind indirekt im Array vorhanden, d. h. das Array verwaltet nur Zeiger auf die Daten. Um die Verwaltung der eigentlichen Daten muß sich die Applikation selbst kümmern.
| Beispiele für die Namengebung | |
Alle Klassen sind als Template-Klassen implementiert. Der Buchstaben T scheint überflüssig. Er ist aber im Namen vorhanden, um die Klassen sofort von der früheren Borland-Klassenbibliothek unterscheiden zu können, die nicht mit Templates implementiert war.
| Template-Klassen | |
Indirekt bedeutet, daß die eigentlichen Daten nicht mit dem abstrakten Datentyp verwaltet werden, sondern nur Zeiger auf die Daten.
| Indirekt | |
Managed bedeutet, daß die Speicherverwaltung als Template-Klasse übergeben wird. Es findet nicht die in der Template-Klassenbibliothek vorhandene Speicherverwaltung Verwendung. Der Anwender der Klasse kann eine Speicherverwaltung zur Verfügung stellen, die ganz den eigenen Bedürfnissen angepaßt ist.
| Managed | |
Verfügt die Klasse über ein C (Counted) im Namen, so ist die Anzahl der im abstrakten Datentyp vorhandenen Daten bekannt.
| Counted | |
Ist die Klasse sortiert (S), so sind die Daten nach einem Ordnungskriterium sortiert. Dieses Ordnungskriterium stellt die Klasse bereit, für den der abstrakte Datentyp instanziert wird.
Speicherverwaltung der Klassen
| Sortiert | |
Die Speicherverwaltung der Klassen befindet sich in der Datei HALLOCTR.H, die drei Klassen enthält:
- class THugeStandardAllocator
- class THugeSharedAllocator
- class THugeManaged_T
Diese drei Klassen kapseln die komplette Speicherverwaltung der Array- und Vektorklassen ab. Die Klasse THugeStandardAllocator wird als Speicherverwaltungsklasse aller Klassen verwendet, deren Name kein M (Managed) enthält. Die anderen beiden Klassen können für die Speicherverwaltung der Klassen mit einem M im Namen verwendet werden. Diesen Klassen muß der Name einer Klasse, die die Speicherverwaltung übernimmt, als Parameter übergeben werden.
| HALLOCTR.H | |
Die Klasse THugeStandardAllocator basiert auf den globalen new- und-delete Funktionen für die Speicherverwaltung.
| Klasse THugeStandardAllocator | |
Die Klasse THugeSharedAllocator verwendet unter MS-Windows die GlobalAlloc- und GlobalFree-Funktionen, um den kompletten Speicher, der von MS-Windows zur Verfügung gestellt wird, für die Container verwenden zu können. Unter MS-DOS werden bei dieser Speicherverwaltungsklasse wie bei der Klasse THugeStandardAllocator die globalen new- und delete-Operatoren verwendet.
Die Klasse THugeManaged_T kann verwendet werden, um klassenspezifische new- und delete-Funktionen zu benutzen.
Memberfunktionen von THugeStandardAllocator
Die Klasse THugeStandardAllocator bietet sechs Memberfunktionen, viermal den überladenen Operator new und zweimal den überladenen Operator delete.
| Klasse THugeSharedAllocator | |
| Operator new
|
friend void *operator new(unsigned long sz, const THugeStandardAllocator&)
friend void *operator new [] (unsigned long sz, const THugeStandardAllocator&)
friend void *operator new(unsigned long, void huge *ptr)
friend void *operator new [] (unsigned long, void __huge *ptr)
|
Der erste new-Operator erhält als Parameter die Größe des Speicherbereichs und eine Referenz auf ein Objekt der Klasse THugeStandardAllocator. Der zweite new-Operator erhält dieselben Parameter, ist aber für das Allokieren von Speicher für Arrays zuständig. Beide Operatoren rufen den globalen Operator new der Laufzeitbibliothek auf.
Der dritte new-Operator erhält als Parameter die Größe des Speicherbereichs und einen Zeiger. Der vierte new-Operator erhält dieselben Parameter wie der obige Operator, allokiert aber Speicher für Arrays.
| |
void operator delete(void huge *ptr)
void operator delete [] (void huge *ptr)
Der erste delete-Operator erhält als Parameter den Zeiger auf den Speicherbereich, der freigegeben werden soll. Der zweite delete-Operator ist für die Freigabe von Speicher für Arrays zuständig. Beide delete-Operatoren rufen die globalen Operatoren delete auf.
| Operator delete | |
Die Definition der Klasse THugeManaged_T lautet:
template class
ThugeManaged_T : private Alloc
Die Template-Klasse wird durch zwei Parameter beeinflußt. Der erste Parameter bestimmt den Datentyp, der verwaltet werden soll. Der zweite Parameter kennzeichnet die Klasse, die die Speicherverwaltung vornimmt.
| Klasse THugeManaged_T |
Alloc::operator delete;
Alloc::operator delete [];
Konsequenterweise wird der Operator delete von der Klasse aufgerufen, die für die Speicherverwaltung zuständig ist. Dasselbe gilt natürlich auch für den Operator-delete-Aufruf für Arrays von Objekten.
| Operator delete |
THugeManaged_T()
Der Defaultkonstruktor verrichtet keine Aufgaben.
| Konstruktor |
THugeManaged_T(const T& t) : data(t)
Der Kopierkonstruktor initialisiert das private Datenelement vom Typ des ersten Klassenparameters mit dem als Parameter übergebenen Wert.
| Kopierkonstruktor |
const THugeManaged_T& operator = (const
THugeManaged_T& t)
Für eine eigene Speicherverwaltung muß auch der Zuweisungsoperator definiert werden, da dieser sonst vom Compiler als 1:1-Zuweisung generiert würde. Der als Parameter übergebene Wert wird dem privaten Datenelement der Klasse zugewiesen.
| Zuweisungs-operator |
operator T&()
Der Referenzoperator gibt einen Zeiger auf das private Element der Klasse zurück. Dieses Element ist vom Typ des ersten Template-Klassenparameters.
In den Array- und Vektorklassen wird nur die Klasse THugeStandardAllocator benutzt. Die restlichen Klassen sind für einen möglichen Einsatz der M-(Managed-)Versionen von Arrays oder Vektoren vorhanden.
HugeVector-Klassen
Die HugeVector-Klassen existieren in folgenden Ausprägungen:
- TC Template Counted
- TIC Template Indirekt Counted
- TIS Template Indirekt Sortiert
- TI Template Indirekt
- TMC Template Managed Counted
- TMIC Template Managed Indirekt Counted
- TMIS Template Managed Indirekt Sortiert
- TMI Template Managed Indirekt
- TMS Template Managed Sortiert
- TM Template Managed
- TS Template Sortiert
- T Template
| Referenzoperator |
template class
THugeVectorImpBase : public Alloc
Die Basisklasse aller Vektor-Template-Klassen ist die Klasse THugeVectorImpBase. Diese Klasse ist von der Klasse Alloc abgeleitet. Die Klasse Alloc wiederum ist ein Template-Parameter.
Von der Klasse THugeVectorImpBase sind die zwei Klassen
- TMHugeVectorImp
- TMIHugeVectorImp
abgeleitet. Von der Klasse TMHugeVectorImp sind
- THugeVectorImp
- TMCHugeVectorImp
abgeleitet. Die Klasse TMCHugeVectorImp ist die Basisklasse für die Klassen
- TCHugeVectorImp
- TMSHugeVectorImp
Von der Klasse TMSHugeVectorImp ist die Klasse
abgeleitet. Die Klasse TMIHugeVectorImp bildet die Basis für die abgeleiteten Klassen
- TIHugeVectorImp
- TMICHugeVectorImp
TMICHugeVectorImp ist die Basisklasse der beiden Klassen
- TICHugeVectorImp
- TMISHugeVectorImp
Die Klasse TMIS schließlich ist die Basisklasse der Klasse
Der Klassenbaum für die Iteratoren, die zu allen Vektorklassen definiert sind, ist identisch.
Klasse THugeVectorImpBase
Die Klasse THugeVectorImpBase ist die Basisklasse für alle Vektorklassen. Die in dieser Klasse enthaltenen Funktionen werden von allen abgeleiteten Klassen geerbt.
| Basisklasse |
THugeVectorImpBase()
Es gibt einen Defaultkonstruktor. Dieser Konstruktor initialisiert Klassenvariablen in definierter Weise.
| Defaultkonstruktor |
THugeVectorImpBase(unsigned long sz, unsigned long d)
Der zweite Konstruktor benötigt zwei unsigned-long-Werte als Parameter. Der erste Parameter gibt die Anzahl der Elemente im Vektor an. Der zweite Parameter wird für die abgeleiteten Klassen benötigt. Er ist in der Basisklasse wegen der identischen Schnittstelle vorhanden.
| Konstruktor |
THugeVectorImpBase(const THugeVectorImpBase&)
Der dritte Konstruktor ist der Kopierkonstruktor. Er erhält als Parameter eine Referenz eines Vektors. Von diesem Vektor wird eine Kopie angelegt.
| Kopierkonstruktor | |
| Zuweisungs-operator
|
const THugeVectorImpBase& operator = (const THugeVectorImpBase&)
|
Der Zuweisungsoperator weist einen Vektor komplett einem anderen Vektor zu.
| |
~THugeVectorImpBase()
Der Destruktor löscht die allokierten Daten.
| Destruktor |
unsigned long Limit() const
Limit gibt die Grenze des Vektors zurück.
| Memberfunktion Limit |
virtual unsigned long Top() const
Top gibt die Nummer des obersten Elements zurück.
| Memberfunktion Top |
virtual unsigned long Count() const
Count gibt die Anzahl der Elemente des Vektors zurück.
| Memberfunktion Count |
int Resize(unsigned long, unsigned long = 0)
Resize erzeugt einen neuen Vektor in der Größe des ersten Parameters. Die im alten Vektor vorhandenen Daten werden in den neuen Vektor übernommen.
| Memberfunktion Resize |
virtual unsigned long GetDelta() const
GetDelta liefert bei der Klasse THugeVectorImpBase immer 0 zurück.
| Memberfunktion GetDelta |
virtual void Zero(unsigned long, unsigned long)
Zero hat den Zugriffsbereich protected. Diese Memberfunktion ist nur aus Schnittstellengründen vorhanden. In der Klasse THugeVectorImpBase ist die Implementierung leer.
Klasse TMHugeVectorImp
Die Deklaration der Klasse TMHugeVectorImp lautet:
template class TMHugeVectorImp
Die Klasse TMHugeVectorImp erbt alle Memberfunktionen der Basisklasse THugeVectorImpBase. Zusätzlich sind in der Klasse weitere Memberfunktionen implementiert.
| Memberfunktion Zero |
TMHugeVectorImp()
Der Defaultkonstruktor überschreibt die Implementierung der Basisklasse. Er ruft seinerseits den Konstruktor der Basisklasse THugeVectorImpBase mit den beiden Template-Klassenparametern auf.
| Defaultkonstruktor |
TMHugeVectorImp(unsigned long sz, unsigned long d = 0)
Der Konstruktor mit den beiden unsigned-long-Parametern ruft ebenfalls den zugehörigen Konstruktor der Basisklasse auf. Die Implementierung des Konstruktors mit dem Aufruf des Basisklassenkonstruktors muß explizit vorhanden sein, da die beiden Templateparameter übergeben werden müssen.
T __huge & operator [] (unsigned long index)
| Konstruktor | |
Der Operator [] ist für die linke Seite der Zuweisung. Auf ein Vektorelement kann in der bekannten Arrayindexschreibweise zugegriffen werden.
T __huge & operator [] ( unsigned long index ) const
Auch für die rechte Seite der Zuweisung ist ein Operator [] vorhanden. Die Funktion ist const deklariert, was bedeutet, daß sie keine Werte ändert.
| Operator [] |
void Flush(unsigned long = ULONG_MAX, unsigned long = 0)
Die Memberfunktion Flush erfüllt in dieser Klasse keine Aufgabe. Sie muß nur eine konsistente Schnittstelle für die abgeleiteten Klassen zur Verfügung stellen.
| Memberfunktion Flush |
void ForEach(IterFunc iter, void *args)
ForEach gestattet das Durchwandern des Vektors zu dem Zweck, auf jedes Datum eine Funktion anzuwenden. Der erste Parameter ist die Funktion, die für jedes Datenelement aufgerufen werden soll. Über den zweiten Parameter können der Funktion Parameter übergeben werden.
| Memberfunktion ForEach | |
| Überlagerte Memberfunktion ForEach
|
void ForEach(IterFunc iter, void *args, unsigned long start, unsigned long stop)
|
Die überlagerte Memberfunktion ForEach gestattet das Anwenden der Iteratorfunktion auf einen Teilbereich des Vektors. Die letzten beiden Parameter geben den Start- und den Endeindex der Vektorelemente an, auf die die Funktion angewendet wird.
| | |
| Memberfunktion FirstThat
|
T __huge *FirstThat(CondFunc cond, void *args, unsigned long start, unsigned long stop) const
T __huge *FirstThat(CondFunc cond, void *args) const
|
FirstThat liefert einen Zeiger auf ein Element des Vektors, das eine bestimmte Bedingung erfüllt. Die Bedingung ermittelt die Funktion, die als erster Parameter übergeben wird. Sie muß TRUE liefern, wenn das Element ausgewählt werden soll. Der Funktion können mittels des zweiten Parameters Argumente übergeben werden. Der Bereich der Suche wird durch die letzten beiden Elemente eingeschränkt.
Die zweite Version der Memberfunktion FirstThat ist ähnlich der ersten. In dieser Version wird jedoch die Suche nach dem Datenelement im gesamten Vektor durchgeführt.
| | |
| Memberfunktion LastThat
|
T __huge *LastThat(CondFunc cond, void *args, unsigned long start, unsigned long stop) const
T __huge *LastThat(CondFunc cond, void *args) const
|
Die Memberfunktion LastThat ist ähnlich der Funktion FirstThat, allerdings erfolgt die Suche in umgekehrter Reihenfolge (vom Ende zum Anfang). Bei dieser Version ist der Suchbereich auf einen Teil des Vektors beschränkt.
Die zweite Version der Memberfunktion LastThat arbeitet ohne Einschränkung des Suchbereichs.
Klasse THugeVectorImp
Die Klasse THugeVectorImp bietet keine zusätzliche Funktionalität. Sie beschränkt sich auf die von den Basisklassen geerbten Memberfunktionen
- THugeVectorImpBase
- TMHugeVectorImp
Klasse TMHugeVectorImp
Eine weitere von TMHugeVectorImp abgeleitete Klasse ist TMCHugeVectorImp. Deren Deklaration lautet:
template class TMCHugeVectorImp
Die folgenden Memberfunktionen wurden neu implementiert, da in dieser Klasse die vorhandenen Elemente gezählt werden:
- Konstruktoren
- Flush
- Top
- Count
- GetDelta
Darüber hinaus sind neue Memberfunktionen vorhanden:
| |
int Add(const T& )
Add hängt ein Element an den Vektor an. Ist der Vektor bereits vollständig gefüllt, so wird er vergrößert, wenn das Element delta im Konstruktor ungleich 0 war (0 ist Defaulteinstellung). War der Delta-Wert 0, so ergibt die Funktion Add einen Fehler (liefert 0 zurück).
| Memberfunktion Add |
int AddAt(const T&, unsigned long)
AddAt fügt ein Element an eine bestimmte Position in den Vektor ein. Ist diese Position bereits besetzt, so werden alle Elemente ab der Position um eine Position weiter geschoben und das Element an der Position eingefügt. Ist der Vektor bereits voll, so kommt der gleiche Mechanismus wie bei der Funktion Add zum Tragen.
| Memberfunktion AddAt |
int Detach(const T& t)
int Detach(unsigned long loc)
Detach entfernt das erste Element, das gleich dem Objekt ist, das als Parameter übergeben wird. Die Elemente hinter dem gelöschten Objekt werden um eine Position weiter nach vorn geschoben, so daß keine Lücke im Vektor entsteht.
Die zweite Memberfunktion Detach entfernt das Element an der Position loc. Auch bei dieser Version werden die Elemente verschoben, damit keine Lücke entsteht.
| Memberfunktion Detach |
int IsEmpty() const
IsEmpty liefert 1, wenn der Vektor leer ist. Befinden sich Elemente im Vektor, so ist das Funktionsergebnis 0.
| Memberfunktion IsEmpty |
virtual unsigned long Find(const T&) const;
Find sucht ein Objekt (identisch mit dem als Parameter übergebenen) im Vektor. Als Funktionsergebnis wird der Offset im Vektor zurückgeliefert.
Klasse TMCHugeVectorImp
Die von der Klasse TMCHugeVectorImp abgeleitete Klasse TCHugeVectorImp verfügt über keine neuen Memberfunktionen. Sie ist lediglich in der Speicherverwaltung auf die Klasse THugeStandardAllocator festgelegt. Sie benötigt nur einen Template-Parameter für den Objekttyp.
Klasse TMSHugeVectorImp
Die ebenfalls von der Klasse TMCHugeVectorImp abgeleitete Klasse TMSHugeVectorImp verfügt über neue Implementierungen für
Diese geänderten Funktionsimplementierungen sind notwendig, da die Elemente in diesem Vektor sortiert sind.
Klasse TSHugeVectorImp
Die Klasse TSHugeVectorImp ist eine Spezialisierung der Basisklasse TMSHugeVectorImp. Auch hier wird für die Speicherverwaltung die Klasse THugeStandardAllocator verwendet, weswegen der zweite Template-Parameter in der Deklaration entfällt.
Klasse TMIHugeVectorImp
Die zweite Klasse, die von der Basisklasse THugeVectorImp abgeleitet wurde, ist die Klasse TMIHugeVectorImp. Auch sie verfügt über dieselben Memberfunktion wie die andere von THugeVectorImpBase abgeleitete Klasse (TMHugeVectorImp). Die folgenden Memberfunktionen sind aber wegen der unterschiedlichen Gegebenheiten neu implementiert:
- Konstruktoren
- Operator []
- Flush
- ForEach
- FirstThat
- LastThat
Klasse TIHugeVectorImp
Die von der Basisklasse TMIHugeVectorImp abgeleitete Klasse TIHugeVectorImp stellt wiederum eine Spezialisierung bezüglich der Speicherverwaltung dar (Klasse THugeStandardAllocator).
Klasse TMICHugeVectorImp
Die Klasse TMICHugeVectorImp (abgeleitet von der Basisklasse TMIHugeVectorImp) verfügt über neue Elementfunktionen. Die neuen Funktionen sind:
- Add
- AddAt
- Detach
- IsEmpty
- Find
Die Funktionen sind in ihrer Funktionalität identisch mitdenjenigen der Klasse TMCHugeVectorImp.
Die Spezialisierung bezüglich der Speicherverwaltung befindet sich in der abgeleiteten Klasse TICHugeVectorImp.
Klasse TMISHugeVectorImp
Eine weitere abgeleitete Klasse der Basisklasse TMICHugeVectorImp ist TMISHugeVectorImp. Diese Vektorklasse verwaltet ihre Elemente sortiert (wie die Klasse TMSHugeVectorImp). Auch die Klasse TMISHugeVectorImp verfügt über die beiden Memberfunktionen:
Klasse TISHugeVectorImp
Die letzte Vektorklasse stellt wieder eine Spezialisierungsform bezüglich der Speicherverwaltung dar. Die Klasse TISHugeVectorImp (abgeleitet von der Basisklasse TMISHugeVectorImp) erledigt die Speicherverwaltung mit der Klasse THugeStandardAllocator.
| Memberfunktion Find | |
Der Klassenbaum der Vektorklassen ist symmetrisch. Es existieren zwei Teilbäume. Ein Teilbaum verwaltet die Datenelemente selbst im Container (ohne I im Namen), der andere Teilbaum verwaltet nur Zeiger auf die Elemente (I im Namen). In beiden Teilbäumen gibt es Versionen, die die Anzahl der enthaltenen Elemente kennen, und davon abgeleitete Versionen, die die Elemente sortiert halten. Zu allen Klassen existieren die Spezialisierungen bezüglich der Speicherverwaltung.
| Symmetrischer Klassenbaum | |
Der Klassenbaum der Iteratoren ist nahezu identisch mit dem Klassenbaum der Vektoren. Es ist keine Basisklasse für Iteratoren vorhanden. Die beiden Basisklassen sind:
- TMHugeVectorIteratorImp
- TMIHugeVectorIteratorImp
Die Funktionalität aller Iteratoren ist identisch. Es unterscheidet sich nur die Implementierung. Bezüglich der Speicherverwaltung gibt es dieselben Spezialisierungen wie bei den Vektorklassen.
Klasse TMHugeVectorIteratorImp
Die Klassendeklaration der Klasse TMHugeVectorIteratorImp lautet:
template class TMHugeVectorIteratorImp
Auch die Iteratoren verwenden das Speicherverwaltungskonzept der Vektorklassen.
| Iteratoren |
TMHugeVectorIteratorImp(const
TMHugeVectorImp&v)
TMHugeVectorIteratorImp(const
TMHugeVectorImp&v, unsigned long start, unsigned long stop)
Der Konstruktor erzeugt ein Iterator-Element, mit dem alle Objekte des als Parameter übergebenen Vektorobjekts durchlaufen werden können.
Der zweite Konstruktor mit den beiden zusätzlichen Parametern (neben dem Vektor-Objekt) erzeugt ein Iterator-Objekt mit begrenztem Durchlauf. Der zweite Parameter gibt die Untergrenze, der dritte Parameter die Obergrenze im Vektor an. Nur die Elemente in diesem Bereich werden vom Iterator bearbeitet.
| Konstruktor |
operator int() const
Der Funktionsoperator liefert 1, wenn im Vektor noch Elemente vorhanden sind. Nach dem letzten Element liefert er 0.
| Funktionsoperator |
const T __huge & Current() const
Current liefert das aktuelle Objekt zurück.
| Memberfunktion Current |
const T __huge & operator ++ (int)
Der Operator ++ mit dem Integerparameter ist der Post-Inkrement-Operator. Das Objekt an der Iteratorposition wird zurückgeliefert. Vor der Rückgabe wird aber der Iterator noch auf das nächste Element gesetzt.
| Operator ++ |
const T __huge & operator ++ ()
Der Operator ++ ohne Parameter ist der Pre-Inkrement-Operator. Der Iterator wird zuerst auf das nächste Element des Vektors gesetzt und das Objekt als Ergebnis zurückgeliefert.
| Operator ++ |
void Restart()
void Restart(unsigned long start, unsigned long stop)
Restart ohne Parameter setzt den Iterator wieder auf den ersten Wert des Vektors. Beim Durchlauf durch die Objekte des Vektors werden alle Objekte behandelt.
Restart mit zwei Parametern setzt den Iterator auf das Objekt mit der Nummer des ersten Parameters. Der Durchlauf durch die Objekte des Vektors endet beim Element mit der Nummer des zweiten Parameters.
Alle andern Iteratorklassen verfügen über dieselben Memberfunktionen.
HugeArray Klassen
Die HugeArray-Klassen existieren in den Ausprägungen
- T Template
- TI Template Indirekt
- TIS Template Indirekt Sortiert
- TM Template Managed
- TMI Template Managed Indirekt
- TMS Template Managed Sortiert
- TMIS Template Managed Indirekt Sortiert
- TS Template Sortiert
| Memberfunktion Restart | |
Die Basisklasse des Baums ist die Klasse THugeArrayAsVectorImp. Von dieser Klasse sind zwei weitere Implementationsklassen abgeleitet:
- TDHugeArrayAsVectorImp
- TIHugeArrayAsVectorImp
Von diesen drei Klassen werden die eigentlichen Arrayklassen abgeleitet.
Von der Klasse TDHugeArrayAsVectorImp sind die beiden Klassen
- TMHugeArrayAsVector
- TMSHugeArrayAsVector
abgeleitet. Die Klasse TMHugeArrayAsVector ist die Basisklasse der Klasse THugeArrayAsVector.
Die Klasse TMSHugeArrayAsVector ist die Basisklasse der Klasse TSHugeArrayAsVector.
Der Klasse TIHugeArrayAsVectorImp entstammen die Klassen
- TMIHugeArrayAsVector
- TMISHugeArrayAsVector
Die Klasse TMIHugeArrayAsVector ist die Basisklasse der Klasse TIHugeArrayAsVector, TMISHugeArrayAsVector ist die Basisklasse der Klasse TISHugeArrayAsVector.
Auch dieser Klassenbaum ist symmetrisch aufgebaut, wobei die Hauptunterscheidung darin besteht, ob im Container die Daten verwaltet werden oder nur Zeiger auf die Daten.
Klasse THugeArrayAsVectorImp
Von der Basisklasse THugeArrayAsVectorImp erben alle nachfolgenden Klassen. Diese Klasse benötigt zwei Template-Parameter. Der erste Parameter gibt die für die Implementierung zuständige Vektorklasse an, der zweite Parameter gibt die Klasse an, die verwaltet werden soll.
| Klassenbaum |
THugeArrayAsVectorImp(long upper, long lower, long delta)
Der Konstruktor erzeugt ein Objekt mit der Obergrenze upper, der Untergrenze lower und der Möglichkeit, das Array um delta Elemente bei Bedarf zu vergrößern. Die Parameter lower und delta sind default-Parameter, die mit 0 vorbelegt sind. Ist delta 0, so kann das Array bei Bedarf nicht wachsen.
| Konstruktor |
long LowerBound() const
LowerBound gibt die Untergrenze des Arrays zurück. Das Array muß nicht mit dem Index 0 beginnen, wie es in C üblich ist.
| Memberfunktion LowerBound |
long UpperBound() const
UpperBound gibt die Obergrenze des Arrays zurück.
| Memberfunktion UpperBound |
unsigned long ArraySize() const
ArraySize gibt die augenblickliche Größe des Arrays zurück.
| Memberfunktion ArraySize |
int IsFull() const
IsFull liefert den Wert 1, wenn das Array voll ist. Wenn noch Elemente im Array Platz haben, ist das Funktionsergebnis 0,
| Memberfunktion IsFull |
int IsEmpty() const
IsEmpty liefert den Wert 1, wenn das Array kein Element enthält. Sind Elemente im Array vorhanden, so ist das Funktionsergebnis 0.
| Memberfunktion IsEmpty |
unsigned long GetItemsInContainer() const
GetItemsInContainer liefert die Anzahl der im Container vorhandenen Elemente zurück.
| Memberfunktion GetItemsInContainer |
void Reallocate(unsigned long sz, unsigned long offset = 0)
Reallocate versucht, die Größe des Arrays zu verändern. Dies ist nur möglich, wenn der Parameter delta im Konstruktor ungleich 0 war. Die neue Größe muß der Funktion als erster Parameter übergeben werden. Der zweite Parameter ist ein default-Parameter, der mit 0 vorbelegt ist. Der Wert gibt den Offset des ersten alten Array-Eintrags im neuen Array an.
| Memberfunktion Reallocate |
void SetData(long loc, const T & t)
SetData ersetzt die Daten an der Stelle, die als erster Parameter übergeben wird, durch die Daten des zweiten Parameters.
| Memberfunktion SetData |
void RemoveEntry(long loc)
RemoveEntry löscht ein Element an der Position, die als Parameter übergeben wird. Alle folgenden Elemente werden um eine Position nach vorn verschoben, so daß keine Lücke in den Daten entsteht.
| Memberfunktion RemoveEntry |
void SqueezeEntry(unsigned long loc)
SqueezeEntry verfügt über dieselbe Funktionalität wie die Memberfunktion RemoveEntry.
| Memberfunktion SqueezeEntry |
unsigned long ZeroBase(long loc) const
ZeroBase liefert den berichtigten Array-Index zurück. Der als Parameter übergebene Array-Index wird berichtigt, falls die Untergrenze des Arrays nicht mit 0 beginnt. Dieser berichtigte Index ist das Funktionsergebnis.
| Memberfunktion ZeroBase |
long BoundBase(unsigned long loc) const
BoundBase paßt die Vektoren, deren Index mit 0 beginnt, an die Array-Indizierung an. Die Array-Indizierung muß nicht mit 0 beginnen, falls das Array im Konstruktor mit einer unteren Grenze ungleich 0 angelegt wurde.
| Memberfunktion BoundBase |
void Grow(long loc)
Grow erweitert das Array, so daß der als Parameter übergebene Index innerhalb des Arrays liegt.
Klassen TDHugeArrayAsVectorImp und TIHugeArrayAsVectorImp
Die folgenden Klassen erweitern die zur Verfügung stehenden Memberfunktionen der gemeinsamen Basisklasse THugeArrayAsVectorImp.
- TDHugeArrayAsVectorImp
- TIHugeArrayAsVectorImp
Die Klassendeklarationen lauten:
| Memberfunktion Grow
|
template class TDHugeArrayAsVectorImp : public THugeArrayAsVectorImp
template class TIHugeArrayAsVectorImp : public THugeArrayAsVectorImp, public TShouldDelete
|
Die beiden Klassendeklarationen unterscheiden sich bei der Weitergabe des zweiten Template-Parameters und bei der Initialisierung des Elements TShouldDelete. Da die zweite Klasse die Daten indirekt über Zeiger auf die Objekte verwaltet, gibt sie den zweiten Template-Parameter nur als Zeiger weiter. Bei der Klasse TIHugeArrayAsVectorImp werden die Objekte nicht vom Container verwaltet. Deswegen stellt sich die Frage, wer beim Löschen das Objekt löschen soll. Durch den Parameter TShouldDelete kann dem Container mitgeteilt werden, ob er dies tun soll oder ob die Löschung von jemand anderem vorgenommen wird.
| |
TDHugeArrayAsVectorImp(long upper, long lower, long delta)
Der Konstruktor legt ein Array mit Obergrenze laut zweitem und Untergrenze laut erstem Parameters an. Der dritte Parameter gibt an, ob das Array bei Bedarf vergrößert werden kann (> 0). Der zweite und der dritte Parameter sind Defaultparameter, die mit 0 vorbesetzt sind.
| Konstruktor |
int Add(const T & t)
Add fügt das als Parameter übergebene Objekt an das Ende des Arrays an. Ist das Array voll, so entscheidet der dritte Parameter des Konstruktors, ob das Array vergrößert wird, oder ob das Element nicht mehr eingefügt wird.
| Memberfunktion Add |
int Detach(const T & t)
int Detach(long loc)
Detach mit dem Containerelement als Parameter entfernt das Element, das identisch mit dem als Parameter übergebenen Objekt ist, aus dem Array.
Detach mit dem long-Parameter entfernt das Objekt an der als Parameter übergebenen Position aus dem Array.
| Memberfunktion Detach |
int Destroy(const T & t)
int Destroy(long loc)
Destroy mit dem Containerelement als Parameter löscht das Element, das identisch mit dem als Parameter übergebenen Objekt ist, aus dem Array.
Destroy mit dem long Parameter löscht das Objekt an der als Parameter übergebenen Position aus dem Array.
| Memberfunktion Destroy |
int HasMember(const T & t) const
HasMember liefert eine 1 als Ergebnis, wenn ein Element im Array vorhanden ist, das identisch mit dem als Parameter übergebenen Objekt ist.
| Memberfunktion HasMember |
long Find(const T & t) const
Find sucht ein Element im Array, das identisch mit dem als Objekt übergebenen ist. Als Funktionsergebnis wird der Array-Index zurückgegeben.
| Memberfunktion Find |
T __huge & operator [](long loc)
T __huge & operator [](long loc) const
Der Operator [] liefert eine Referenz auf das Objekt an der Position des Array-Index, der als Parameter übergeben wird.
Der zweite Operator [] ist ähnlich dem ersten. Durch seine const-Deklaration kann er für const-Objekte verwendet werden.
| Operator [] |
void ForEach(IterFunc iter, void *args)
ForEach erzeugt einen Iterator. Mit diesem Iterator wird die als erster Parameter übergebene Funktion auf alle Elemente des Arrays angewendet. Dieser Funktion können über den zweiten Parameter Argumente übergeben werden.
| Memberfunktion ForEach |
T __huge *FirstThat(CondFunc cond, void *args) const
FirstThat liefert einen Zeiger auf das erste Objekt des Arrays, das einer Bedingung genügt. Die Bedingung wird durch die Funktion geprüft, die als erster Parameter übergeben wird. Dieser Funktion können über den zweiten Parameter Argumente übergeben werden.
| Memberfunktion FirstThat |
T __huge *LastThat(CondFunc cond, void *args) const
LastThat ist ähnlich zu FirstThat. Diese Memberfunktion sucht jedoch das letzte Element des Arrays, das der Bedingung genügt.
| Memberfunktion LastThat |
void Flush()
Flush löscht alle Objekte aus dem Array. Das Array selbst bleibt jedoch bestehen.
| Memberfunktion Flush |
const T __huge & ItemAt(long i) const
ItemAt hat die Zugriffsberechtigung private. Die Memberfunktion liefert das Objekt an der Position, die als Parameter übergeben wird zurück.
Die weiteren von TDHugeArrayAsVectorImp und TIHugeArrayAsVectorImp abgeleiteten Klassen verfügen über keine neuen Memberfunktionen. Sie haben nur teilweise andere Implementierungen. Die komplette Schnittstelle ist in den drei Basisklassen enthalten.
| Memberfunktion ItemAt | |
Weiterhin sind die zwei Klassen
| Klassen THugeArray TSHugeArray | |
mit den zugehörigen Iteratorklassen
- THugeArrayIterator
- TSHugeArrayIterator
deklariert. Hierbei handelt es sich aber nur um Synonyme für die Klassen THugeArrayAsVector, TSHugeArrayAsVector, THugeArrayAsVectorIterator und TSHugeArrayAsVectorIterator. Diese Klassen werden häufig benutzt, so erspart man sich mit der verkürzten Schreibweise einige Schreibarbeit.
| Iteratorklassen THugeArrayIterator TSHugeArrayIterator | |
Die Iteratoren basieren alle auf den Iteratoren der Vektor-Implementierungsklassen. Sie verfügen über keine zusätzlichen Memberfunktionen.
Die Klasse TMHugeArrayAsVectorIterator ist von der Klasse TMCHugeVectorIteratorImp abgeleitet.
Die Klasse THugeArrayAsVectorIterator ist von der Klasse TMHugeArrayAsVectorIterator abgeleitet.
Die Klasse TMSHugeArrayAsVectorIterator ist von der Klasse TMSHugeVectorIteratorImp abgeleitet.
Die Klasse TSHugeArrayAsVectorIterator ist von der Klasse TMSHugeArrayAsVectorIterator abgeleitet.
Die Klasse TMIHugeArrayAsVectorIterator ist von der Klasse TMICHugeVectorIteratorImp abgeleitet.
Die Klasse TIHugeArrayAsVectorIterator ist von der Klasse TMIHugeArrayAsVectorIterator abgeleitet.
Die Klasse TMISHugeArrayAsVectorIterator ist von der Klasse TMISHugeVectorIteratorImp abgeleitet.
Die Klasse TISHugeArrayAsVectorIterator ist von der Klasse TMISHugeArrayAsVectorIterator abgeleitet.
Mit dieser Klassenbibliothek ist auch unter MS-DOS und MS-Windows die Verwaltung von größeren Datenmengen möglich. So kann man sich auch in den noch weit verbreiteten 16-Bit-Betriebssystemen über die 64-kB-Segmentgrenze des Intel-Prozessors hinwegsetzen.
| Iteratoren
|
|
|