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
kramann.info
© Guido Kramann

Login: Passwort:




Verwendung der Template-KLasse vector aus der Standard-Template-Library (STL)

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.

An dieser Stelle wird ein letztes mal das Beispiel mit der Textzerlegung aufgegriffen, wobei diesmal keine eigene Klasse für das Verwalten der einzelnen Wörter (String-Objekte) geschrieben wird. Statt dessen wird die Klasse vector verwendet. Es handelt sich hierbei, wie der Name schon andeutet, um eine Vektor-Container-Klasse, bei der also der allokierte Speicherbereich zusammenhängt und aus der heraus deshalb schneller einzelne Elemente angesprochen werden können, als das bei Listen der Fall war (vergl. Kapitel 5 Containertypen).

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 <string>
#include <iostream>
#include <vector>

using namespace std;

bool istTrennzeichen(char zeichen, string trennzeichen)
{
    for(int i=0;i<trennzeichen.size();i++)
    {
        if(zeichen == trennzeichen.at(i))
            return true;
    }
    return false;
}


void zerlegeText(vector<string>* mLC,string text,string trennzeichen)
{
    int wortbeginn = 0;
    int wortende   = 0;

    for(int i=0;i<text.size();i++)
    {
        if(  !istTrennzeichen(text.at(i),trennzeichen) )
        {
            wortbeginn = i;
            while( i+1<text.size() && !istTrennzeichen(text.at(i+1),trennzeichen) )
                i++;

            wortende = i;
            mLC->push_back(text.substr(wortbeginn,wortende-wortbeginn+1));            
        }
    }
}


int main(void)
{

    string text = "Das ist ein Text.";        
    string trennzeichen = ".,;: ";
    vector<string> mLC;

    zerlegeText(&mLC,text,trennzeichen);

    cout<<"GROESSE der Liste="<<mLC.size()<<endl;

    for(int i=0;i<mLC.size();i++)
        cout<<"Wort Nr."<<i<<":"<<mLC.at(i)<<endl;    


}
 

Code 0-1: zerlegetext_mitvector.cpp

zerlegetext_mitvector.zip

Erläuterungen zur Verwendung der Klasse vector

Die Verwendung von vector läuft ganz analog zu der Verwendung der selber programmierten Klasse ContainerListeT: 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 0-1: Methoden der Objekte vom Typ vector aus der STL.