kramann.info
© Guido Kramann

Login: Passwort:










Informatik3
1 Vom_struct_zur_Klasse
..1.1 Vom_struct_zur_Klasse
..1.2 struct_Programm
..1.3 Klassen_Programm
..1.4 Offene_Fragen
..1.5 Historie
..1.6 Objektabstraktion
..1.7 OO_Kundenverwaltung
..1.8 Objektfaehigkeiten
..1.9 Formatierung
..1.10 Motivation
..1.11 Uebung1
..1.12 Uebung2
2 UML
..2.1 Volumenberechnung
..2.2 UML_Klassendiagramm
..2.3 Konstruktor
..2.4 Statische_Variable
3 Strings
..3.1 Klassenbibliotheken
..3.2 stringUML
..3.3 Uebung3
4 Initialisierungen
4 bluej
5 Zeiger_und_Arrays
..5.1 Zeiger
..5.2 Zeiger_und_Funktion
..5.3 Uebung4
6 Vererbung
..6.1 MesswerteUML
..6.2 MesswerteProgramm
..6.3 VererbungsProgramm
..6.4 Vector
..6.5 Uebung
7 Modifikatoren
..7.1 public_Vererbung
..7.2 protected_Vererbung
8 Listen_und_Templates
..8.1 Containertypen
....8.1.1 ListeUML
....8.1.2 ListeProgramm
..8.2 Templates
....8.2.1 Listentemplate
....8.2.2 STLvectorTemplate
..8.3 Uebung5
..8.4 Uebung6
..8.5 Uebung7
9 Java
..9.1 Uebung
..9.2 GettingStarted
..9.3 Animation
..9.4 Hybrid
..9.5 Threads
10 Delegation
11 LayoutProjekt
12 Fenster
13 Uebung
14 Zwischenprojekt
..14.1 Befehle
..14.2 Planung
..14.3 JNI
..14.4 JNIumsetzen
..14.5 Anwendungsklasse
..14.6 GUI01
..14.7 GUI02
15 Rasterlayout
..15.1 Bilder_Packages
..15.2 interfaces
..15.3 ArrayList
..15.4 clone
..15.5 Uebung
16 Nuetzliches
..16.1 Threads
..16.2 Animation
..16.3 RungeKutta
..16.4 Loesungsansatz
..16.5 Internetprogrammierung
....16.5.1 Codegenerierung
....16.5.2 PHP_Programmierung
....16.5.3 PHP_OOP
....16.5.4 Java
17 Algorithmen
..17.1 RungeKutta
..17.2 Loesungsansatz
..17.3 Evoopt
..17.4 Uebung12
..17.5 Uebung8_2014
..17.6 Ausdruecke
18 Uebung10
19 UML_ALT
..19.1 Flaechenberechnung
..19.2 UML_Flaechenberechnung
..19.3 Implementierung
..19.4 ListeUML
..19.5 ListenImplementierung
..19.6 Anwendung

6.4 Die STL-Klasse vector

Das sammeln von Elementen, deren Anzahl nicht von vorne herein bekannt ist, ist eine wichtige, immer wieder anzuwendende Möglichkeit in der Programmierung.

Listen für andere Datentypen

Wir könnten nun Varianten für die Klassen Liste und ListenContainer schreiben, um damit nicht nur Strings, sondern auch andere Datentypen, wie ganze Zahlen (int), Fließkommazahlen (double), oder einzelene Zeichen (char) sammeln zu können. Gerade letzteres hat eine besondere Bedeutung, wenn es darum geht, den Inhalt eines Files in den Arbeitsspeicher zu laden.

Fehleranfälligkeit

Diese vielen Varianten zu scheiben, ist jedoch nicht nur lästig und Zeit aufwändig, es birgt auch immer die Gefahr Fehler in die neuen Klassen einzubauen, die zuvor nicht da waren. Zudem machen diese ganzen Klassen ja im Prinzip genau das gleiche. Lediglich der Datentyp des Attributs daten in der Klasse Liste und alle Methoden, die darauf zugreifen müßten jeweils angepasst werden.

So wenig Code wie möglich

Eine wichtige Regel Fehler beim Programmieren zu vermeiden und Programme übesichtlich zu halten, ist es, so wenig Code wie möglich zu schreiben.

Schablonen/Templates anwenden

C++ hält zur einfachen Anpassung unserer Klassen einen einfachen und effizienten Mechanismus bereit: Die Anwendung von Schablonen.

Es ist möglich dem Compiler zu sagen, dass er je nach Bedarf einen anderen Datentyp an den entsprechenden Stellen unserer Objekte, die aus den Klassen Liste und ListenContainer gebildet werden einsetzen soll.

Viele Arten an Container-Klassen samt Template-Mechanismus zur Anpassung des verwalteten Datentyps stehen in der Standard-Template-Library schon zu Verfügung und müssen nicht selber programmiert werden. Jedoch waren die vorangegangenen Ausführungen notwendig, um diese Mechanismen auch zu verstehen und um im entscheidenden Moment, wo Standardlösungen nicht mehr greifen, eigene Containerklassen und Templates, auch unabhängig voneinander erstellen zu können. Allerdings sollen Sie auch nicht von der Erkenntnis verschont werden, wie ungemein viel Programmierarbeit man sich sparen kann, wenn man die richtigen Libraries zur Verfügung hat. Gerade darin liegt die Stärke der OOP.

Hier zunächst ohne weitere Erläuterungen der Programmcode. Er besteht diesmal nur aus einer einzigen C++-Datei, ohne zusätzliche eigene include-Dateien:

#include<iostream>
#include<vector>

using namespace std;

int main(void)
{
    vector<string> vd;
    string input;
    
    cout<<"Geben Sie Woerter ein. Ende mit exit"<<endl;
    
    do
    {
        cin>>input;
        vd.push_back(input);
    } while(input!="exit");
    
    cout<<"Alle Woerter:"<<endl;
    
    for(int i=0;i<vd.size();i++)
        cout<<vd.at(i)<<endl;
        
    system("PAUSE");    
}
 

Code 6.4-1: vector.cpp

Erläuterungen zur Verwendung der Klasse vector

Beim Erzeugen eines Objektes muss man hinter dem Klassentyp in spitzen Klammern noch angeben, von welchem Typ die im Vektor zu speichernden Elemente sein sollen.

Objekte der Klasse vector besitzen eine ganze Reihe an hilfreichen Methoden, um die darin gespeicherten Elemente auszulesen, oder zu manipulieren, viel mehr als wir für ContainerListeT programmiert haben. Einge seien hier angeführt, alle weiteren sind der C++-Referenz unter www.cppreference.com zu entnehmen.

Methode Beschreibung
int size() Liefert die Anzahl der im vector-Objekt gespeicherten Elemente zurück.
at(int) Liefert das i-te Element zurück (ohne den Inhalt des Vektor-Objektes zu verändern).
clear() Löscht alle Elemente im Vektor-Objekt
push_back(<vector-TYP>) Fügt an das Ende der Liste der schon gespeicherten Elemente ein weiteres an, allokiert nötigenfalls weiteren Speicher.
insert(int i,<vector-TYP> e) Fügt das übergebene Element e vor dem i-ten schon gespeicherten Element an.
erase(int) Löscht das i-te gespeicherte Element

Tabelle 6.4-1: Methoden der Objekte vom Typ vector aus der STL.