• Keine Ergebnisse gefunden

STL macht es möglich

N/A
N/A
Protected

Academic year: 2021

Aktie "STL macht es möglich"

Copied!
21
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

23.01.2003 Prof. Zavodnik/C++

Vorlesung/Kap X 1

STL macht es möglich

(2)

Ziel: Algorithmen, unabhängig von Containerklassen zu schreiben

Methode: Templates mit formalen Iteratorparameter schreiben

Auch Typen und

Klassenfunktionen als Parameter

zulassen

(3)

23.01.2003 Prof. Zavodnik/C++

Vorlesung/Kap X 3

Es gibt 5 verschiedene Iterator-typen InputIterator: !=, ==, ++ und *.

Dereferenzierung ist read-only

OutputIterator : Wie Input, nur De- refenzierung ist write-enable

ForwardIterator : Ist InputIterator und

OutputIterator in eine Richtung

(4)

BidirectionalIterator : Wie Forward, aber Durchlauf ist in

beiden Richtungen erlaubt, also ++

und – sind erlaubt

RandomAccessIterator :

Addition und Subtrtaktion mit int ,

überladener [] , Vergleiche

(5)

23.01.2003 Prof. Zavodnik/C++

Vorlesung/Kap X 5

Alle generischen Algorithmen operieren indirekt auf den

Elementen von Containern über diese Iteratoren

Klassenfunktionen können auch

herangezogen werden

(6)

Auch Function Objects für entsprechende Objekte genannt Werden in Klassen durch

Überladung des Klammeroperators () definiert

Warum? Weil Information für den generischen Algorithmus

vorhanden ist. Auch Effizienz

Normale Funktionen auch möglich

(7)

23.01.2003 Prof. Zavodnik/C++

Vorlesung/Kap X 7

Normale Funktion

int sumSquares(int total, int value) {

return total + value*value;

}

(8)

Klassenfunktion

template <class T>

class sumSquaresClass : public binary_function {

public:

const T operator()(const T& total, const T value) {

return total + value*value;

}

(9)

23.01.2003 Prof. Zavodnik/C++

Vorlesung/Kap X 9

accumulate

template <class InputIterator, class Type, class BinaryOperator>

Type accumulate(InputIterator first, InputIterator last, Type initVal,

BinaryOperator op) {

while (first != last){ initVal = op(initVal, *first); ++first;}

return initVal;

}

(10)

! " accumulate

1. Bei normalen Funktionen

int Tabelle[50] = { … };

int sum = 0;

sum = accumulate(Tabelle, Tabelle + 50, 0, sumSquares);

2. Bei Klassenfunktionen

int Tabelle[50] = { … };

int sum = 0;

sum = accumulate(Tabelle, Tabelle + 50, 0, sumSquaresClass<int>()),

(11)

23.01.2003 Prof. Zavodnik/C++

Vorlesung/Kap X 11

# map

Ähnlich zu C++-Reihung, aber Index ist ein Schlüssel

Es gibt zwei Typen

Der Schlüsseltyp Der Typ des Bildes

Unterschied zu Reihungen:

Bildelemente sind nur für

vorhandenen Schlüssel definiert

(schwachbesetzte Darstellung)

(12)

$ % " " &

map

Schlüsselvergleich (Compare)

Wertvergleich (value_compare) ist Funktionsobjekt

Überladener Operator []

(13)

23.01.2003 Prof. Zavodnik/C++

Vorlesung/Kap X 13

' !

Gewichte werden Kanten zugewiesen Konsequenz: Zwei Knoten sind

erforderlich, um einen Kantenwert darstellen zu können

Annahme: Knoten sind durch (C++) string s ettiketiert

Definition in zwei Schritten

map<string, int> ist Zuweisung string --> int

map<string, map<string,int>> ist

korrekt

(14)

(

Gegeben:

Landkarte mit n Städten

Abstand zwischen je zwei Städten

Gesucht: Die Wege von einem festen

Knoten zu allen anderen Knoten, welche die geringste Summe der

Kantengewichte besitzen

Jeder Knoten darf nur einmal

durchschritten werden

(15)

23.01.2003 Prof. Zavodnik/C++

Vorlesung/Kap X 15

) ! "

* + ,

Sortiertes Einfügen: kleinstes, bzw.

größtes Element immer vorn

Abstand von einem festen v

0

zu einem Knoten v wird in eine sog.

pair -Struktur eingetragen:

struct distancePair{

unsigned int first;

string second;

...

};

(16)

v0 sei fest

gesucht:distances[u] = kürzestes Abstand von v0 nach u distances[v0] = 0;

push(0,v0);

while (priority_queue nicht leer)

1. pop kleinstes Paar P der priority_queue;

city = P.second;

Abstand = P.first;

2. if (distances[city] nicht definiert) distances[city] = Abstand;

else übergehen

3. for (jede Stadt u für welche distance[u] nicht definiert)

(17)

23.01.2003 Prof. Zavodnik/C++

Vorlesung/Kap X 17

- . * "

typedef map<string, int> stringVector typedef map<string, stringVector> graph;

graph cityMap;

(18)

-

stringVector distances;

class distancePair : pair<int, string>{

public:

unsigned int first;

string second;

distancePair():first(0){}

distancePair(unsigned int f, string s): first(f), second(s){}};

bool operator > (distancePair, lhs, distancePair rhs) {

return lhs.first > rhs.first;

}

priority_queue<distancePair, vector<distancePair>,

(19)

23.01.2003 Prof. Zavodnik/C++

Vorlesung/Kap X 19

-

int main() {

//initialisiere cityMap string start = ...;

que.push(Object);

while(!queue.empty()){

dummy = que.top();

int distance = dummy.first; string city = dummy.second;

que.pop();

if (!distances.count(city)){

distances[city] = distance;

for(stringVector::iterator start = cityMap[city].begin();

start != cityMap[city].end(); ++start){

int i = (*start).second; //in stringVector string st = (*start).first;

que.push(distancePair(distance + i, st)); } }}

//Lösung ausdrucken return 0;}

(20)

Wolfsegg

Zeitlarn

Wenzenbach

Regenstauf

Regensburg Donaustauf

Bernhardswald Pielenhofen

2

8

4

3 3

4

3 10

5

4

2 5

(21)

23.01.2003 Prof. Zavodnik/C++

Vorlesung/Kap X 21

%

Siehe Vorlesung für Beispiel

Lösung: Siehe Programm

Referenzen

ÄHNLICHE DOKUMENTE

(z.B. Quadrat) Lage, Position, Größe, Strichstärke, Strichfarbe, Füllfarbe, Füllmuster,

Die Funktion keyPressed() wird immer aufgerufen wenn eine Taste gedrückt wird. // 'a' wird gedrückt gehalten println(key); //

Dies bedeutet, dass zwei Objekte der Klasse Person durchaus die gleichen Werte der Attribute haben können.. Zurück zu unserem Beispiel in

 Definition Schnittstelle: Die Menge der Operationen eines Objektes, die von anderen Objekten aufgerufen werden können.. Nicht

–&#34; Ein Objekt ist eine Instanz einer Klasse K, wenn es Element der Menge aller Objekte der Klasse K ist.!. !&#34; Künftig werden wir die Klasse weniger als Menge von Objekten

 Während der Ausführung einer Methode kann ein Objekt auch Methoden bei (anderen) Objekten aufrufen..

■ Eine Klasse enthält einen speziellen Repräsentanten, ein spezielles Objekt, ein Schablonenobjekt (Prototyp) für ihre Objekte. ■ Ein Objekt wird aus einer Klasse

• Für eine einzelne Klasse lohnen sich ein solches Diagramm nicht wirklich :-). • Besteht ein System aber aus sehr vielen Klassen, kann man damit die Beziehungen zwischen