14. Zeiger, Algorithmen, Iteratoren und Container...
Transcript of 14. Zeiger, Algorithmen, Iteratoren und Container...
![Page 1: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/1.jpg)
14. Zeiger, Algorithmen, Iteratoren undContainer II
Iteration mit Zeigern, Felder: Indizes vs. Zeiger, Felder undFunktionen, Zeiger und const, Algorithmen, Container undTraversierung, Vektor-Iteratoren, Typedef, Mengen, dasIterator-Konzept
474
![Page 2: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/2.jpg)
Zur Erinnerung: Mit Zeigern ubers Feld
Beispiel
int a[5] = {3, 4, 6, 1, 2};for (int∗ p = a; p < a+5; ++p)
std::cout << ∗p << ’ ’; // 3 4 6 1 2
Ein Feld ist in einen Zeiger auf sein erstes Element konvertierbar.Zeiger kennen Arithmetik und Vergleiche.Zeiger können dereferenziert werden.
⇒ Mit Zeigern kann man auf Feldern operieren.
475
![Page 3: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/3.jpg)
Zur Erinnerung: Mit Zeigern ubers Feld
Beispiel
int a[5] = {3, 4, 6, 1, 2};for (int∗ p = a; p < a+5; ++p)
std::cout << ∗p << ’ ’; // 3 4 6 1 2
Ein Feld ist in einen Zeiger auf sein erstes Element konvertierbar.
Zeiger kennen Arithmetik
und Vergleiche.Zeiger können dereferenziert werden.
⇒ Mit Zeigern kann man auf Feldern operieren.
475
![Page 4: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/4.jpg)
Zur Erinnerung: Mit Zeigern ubers Feld
Beispiel
int a[5] = {3, 4, 6, 1, 2};for (int∗ p = a; p < a+5; ++p)
std::cout << ∗p << ’ ’; // 3 4 6 1 2
Ein Feld ist in einen Zeiger auf sein erstes Element konvertierbar.Zeiger kennen Arithmetik
und Vergleiche.
Zeiger können dereferenziert werden.⇒ Mit Zeigern kann man auf Feldern operieren.
475
![Page 5: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/5.jpg)
Zur Erinnerung: Mit Zeigern ubers Feld
Beispiel
int a[5] = {3, 4, 6, 1, 2};for (int∗ p = a; p < a+5; ++p)
std::cout << ∗p << ’ ’; // 3 4 6 1 2
Ein Feld ist in einen Zeiger auf sein erstes Element konvertierbar.Zeiger kennen Arithmetik und Vergleiche.
Zeiger können dereferenziert werden.⇒ Mit Zeigern kann man auf Feldern operieren.
475
![Page 6: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/6.jpg)
Zur Erinnerung: Mit Zeigern ubers Feld
Beispiel
int a[5] = {3, 4, 6, 1, 2};for (int∗ p = a; p < a+5; ++p)
std::cout << ∗p << ’ ’; // 3 4 6 1 2
Ein Feld ist in einen Zeiger auf sein erstes Element konvertierbar.Zeiger kennen Arithmetik und Vergleiche.Zeiger können dereferenziert werden.
⇒ Mit Zeigern kann man auf Feldern operieren.
475
![Page 7: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/7.jpg)
Zur Erinnerung: Mit Zeigern ubers Feld
Beispiel
int a[5] = {3, 4, 6, 1, 2};for (int∗ p = a; p < a+5; ++p)
std::cout << ∗p << ’ ’; // 3 4 6 1 2
Ein Feld ist in einen Zeiger auf sein erstes Element konvertierbar.Zeiger kennen Arithmetik und Vergleiche.Zeiger können dereferenziert werden.
⇒ Mit Zeigern kann man auf Feldern operieren.
475
![Page 8: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/8.jpg)
Felder: Indizes vs. Zeiger
int a[n];
// Aufgabe: setze alle Elemente auf 0
// Lösung mit Indizesfor (int i = 0; i < n; ++i)
a[i] = 0;
// Lösung mit Zeigernint* begin = a; // Zeiger aufs erste Elementint* end = a+n; // Zeiger hinter das letzte Elementfor (int* p = begin; p != end; ++p)
*p = 0;
476
![Page 9: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/9.jpg)
Felder: Indizes vs. Zeiger
int a[n];
// Aufgabe: setze alle Elemente auf 0
// Lösung mit Indizesfor (int i = 0; i < n; ++i)
a[i] = 0;
// Lösung mit Zeigernint* begin = a; // Zeiger aufs erste Elementint* end = a+n; // Zeiger hinter das letzte Elementfor (int* p = begin; p != end; ++p)
*p = 0;
476
![Page 10: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/10.jpg)
Felder: Indizes vs. Zeiger
int a[n];
// Aufgabe: setze alle Elemente auf 0
// Lösung mit Indizesfor (int i = 0; i < n; ++i)
a[i] = 0;
// Lösung mit Zeigernint* begin = a; // Zeiger aufs erste Elementint* end = a+n; // Zeiger hinter das letzte Elementfor (int* p = begin; p != end; ++p)
*p = 0;
476
![Page 11: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/11.jpg)
Felder: Indizes vs. Zeiger
int a[n];
// Aufgabe: setze alle Elemente auf 0
// Lösung mit Indizes ist lesbarerfor (int i = 0; i < n; ++i)
a[i] = 0;
// Lösung mit Zeigernint* begin = a; // Zeiger aufs erste Elementint* end = a+n; // Zeiger hinter das letzte Elementfor (int* p = begin; p != end; ++p)
*p = 0;
476
![Page 12: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/12.jpg)
Felder: Indizes vs. Zeiger
int a[n];
// Aufgabe: setze alle Elemente auf 0
// Lösung mit Indizes ist lesbarerfor (int i = 0; i < n; ++i)
a[i] = 0;
// Lösung mit Zeigern ist schneller und allgemeinerint* begin = a; // Zeiger aufs erste Elementint* end = a+n; // Zeiger hinter das letzte Elementfor (int* p = begin; p != end; ++p)
*p = 0;
476
![Page 13: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/13.jpg)
Felder und Indizes
// Setze alle Elemente auf valuefor (int i = 0; i < n; ++i)
a[i] = value;
s
Adresse von a[0] = a+ 0 · s
⇒ Eine Addition und eine Multiplikation pro Element
477
![Page 14: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/14.jpg)
Felder und Indizes
// Setze alle Elemente auf valuefor (int i = 0; i < n; ++i)
a[i] = value;
s
Adresse von a[0] = a+ 0 · s
⇒ Eine Addition und eine Multiplikation pro Element
477
![Page 15: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/15.jpg)
Felder und Indizes
// Setze alle Elemente auf valuefor (int i = 0; i < n; ++i)
a[i] = value;
s
Adresse von a[0] = a+ 0 · s
Adresse von a[1] = a+ 1 · s
⇒ Eine Addition und eine Multiplikation pro Element
477
![Page 16: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/16.jpg)
Felder und Indizes
// Setze alle Elemente auf valuefor (int i = 0; i < n; ++i)
a[i] = value;
s
Adresse von a[0] = a+ 0 · s
Adresse von a[2] = a+ 2 · s
⇒ Eine Addition und eine Multiplikation pro Element
477
![Page 17: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/17.jpg)
Felder und Indizes
// Setze alle Elemente auf valuefor (int i = 0; i < n; ++i)
a[i] = value;
s
Adresse von a[0] = a+ 0 · s
Adresse von a[3] = a+ 3 · s
⇒ Eine Addition und eine Multiplikation pro Element
477
![Page 18: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/18.jpg)
Felder und Indizes
// Setze alle Elemente auf valuefor (int i = 0; i < n; ++i)
a[i] = value;
s
Adresse von a[0] = a+ 0 · s
Adresse von a[n-1] = a+ (n− 1) · s
⇒ Eine Addition und eine Multiplikation pro Element477
![Page 19: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/19.jpg)
Die Wahrheit uber wahlfreien Zugriff
Der Ausdruck
a[i]
ist äquivalent zu
*(a + i)
a+ i · s
478
![Page 20: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/20.jpg)
Die Wahrheit uber wahlfreien Zugriff
Der Ausdruck
a[i]
ist äquivalent zu
*(a + i)
a+ i · s
478
![Page 21: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/21.jpg)
Felder und Zeiger// Setze alle Elemente auf valuefor (int* p = begin; p != end; ++p)∗p = value;
begin end
p
⇒ eine Addition pro Element
479
![Page 22: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/22.jpg)
Felder und Zeiger// Setze alle Elemente auf valuefor (int* p = begin; p != end; ++p)∗p = value;
begin end
p
⇒ eine Addition pro Element
479
![Page 23: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/23.jpg)
Felder und Zeiger// Setze alle Elemente auf valuefor (int* p = begin; p != end; ++p)∗p = value;
begin end
p
p
⇒ eine Addition pro Element
479
![Page 24: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/24.jpg)
Felder und Zeiger// Setze alle Elemente auf valuefor (int* p = begin; p != end; ++p)∗p = value;
begin end
p
p
⇒ eine Addition pro Element
479
![Page 25: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/25.jpg)
Felder und Zeiger// Setze alle Elemente auf valuefor (int* p = begin; p != end; ++p)∗p = value;
begin end
p
p
⇒ eine Addition pro Element
479
![Page 26: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/26.jpg)
Felder und Zeiger// Setze alle Elemente auf valuefor (int* p = begin; p != end; ++p)∗p = value;
begin end
p
p
⇒ eine Addition pro Element479
![Page 27: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/27.jpg)
Ein Buch lesen . . . mit Indizes
Wahlfreier Zugrifföffne Buch auf S.1Klappe Buch zuöffne Buch auf S.2-3Klappe Buch zuöffne Buch auf S.4-5Klappe Buch zu....
Sequentieller Zugrifföffne Buch auf S.1blättere umblättere umblättere umblättere umblättere um...
480
![Page 28: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/28.jpg)
Ein Buch lesen . . . mit Zeigern
Wahlfreier Zugrifföffne Buch auf S.1Klappe Buch zuöffne Buch auf S.2-3Klappe Buch zuöffne Buch auf S.4-5Klappe Buch zu....
Sequentieller Zugrifföffne Buch auf S.1blättere umblättere umblättere umblättere umblättere um...
480
![Page 29: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/29.jpg)
Feldargumente: Call by (const) reference
void print_vector (const int (&v)[3]) {for (int i = 0; i<3 ; ++i) {
std::cout << v[i] << " ";}
}void make_null_vector (int (&v)[3]) {
for (int i = 0; i<3 ; ++i) {v[i] = 0;
}}
481
![Page 30: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/30.jpg)
Feldargumente: Call by value
void make_null_vector (int v[3]) {for (int i = 0; i<3 ; ++i) {
v[i] = 0;}
}...
int a[10];make_null_vector (a); // setzt nur a[0], a[1], a[2]
int∗ b;make_null_vector (b); // kein Feld bei b, Crash!
482
![Page 31: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/31.jpg)
Feldargumente: Call by value (nicht wirklich...)
void make_null_vector (int v[3]) {for (int i = 0; i<3 ; ++i) {
v[i] = 0;}
}...int a[10];make_null_vector (a); // setzt nur a[0], a[1], a[2]
int∗ b;make_null_vector (b); // kein Feld bei b, Crash!
482
![Page 32: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/32.jpg)
Feldargumente: Call by value (nicht wirklich...)
void make_null_vector (int v[3]) {for (int i = 0; i<3 ; ++i) {
v[i] = 0;}
}...int a[10];make_null_vector (a); // setzt nur a[0], a[1], a[2]
int∗ b;make_null_vector (b); // kein Feld bei b, Crash!
482
![Page 33: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/33.jpg)
Feldargumente: Call by value gibt’s nicht
Formale Argumenttypen T[n] oder T[] (Feld über T) sindäquivalent zu T* (Zeiger auf T)
Bei der Übergabe eines Feldes wird ein Zeiger auf das ersteElement übergebenLängeninformation geht verlorenFunktion kann keinen Feldausschnitt verarbeiten (Beispiel:Suche eines Elements nur im hinteren Teil des Feldes)
483
![Page 34: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/34.jpg)
Feldargumente: Call by value gibt’s nicht
Formale Argumenttypen T[n] oder T[] (Feld über T) sindäquivalent zu T* (Zeiger auf T)Bei der Übergabe eines Feldes wird ein Zeiger auf das ersteElement übergeben
Längeninformation geht verlorenFunktion kann keinen Feldausschnitt verarbeiten (Beispiel:Suche eines Elements nur im hinteren Teil des Feldes)
483
![Page 35: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/35.jpg)
Feldargumente: Call by value gibt’s nicht
Formale Argumenttypen T[n] oder T[] (Feld über T) sindäquivalent zu T* (Zeiger auf T)Bei der Übergabe eines Feldes wird ein Zeiger auf das ersteElement übergebenLängeninformation geht verloren
Funktion kann keinen Feldausschnitt verarbeiten (Beispiel:Suche eines Elements nur im hinteren Teil des Feldes)
483
![Page 36: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/36.jpg)
Feldargumente: Call by value gibt’s nicht
Formale Argumenttypen T[n] oder T[] (Feld über T) sindäquivalent zu T* (Zeiger auf T)Bei der Übergabe eines Feldes wird ein Zeiger auf das ersteElement übergebenLängeninformation geht verlorenFunktion kann keinen Feldausschnitt verarbeiten (Beispiel:Suche eines Elements nur im hinteren Teil des Feldes)
483
![Page 37: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/37.jpg)
Felder in Funktionen
Konvention der Standard-Bibliothek: Übergabe eines Feldes (odereines Feldausschnitts) mit zwei Zeigern:
begin: Zeiger auf das erste Elementend: Zeiger hinter das letzte Element[begin, end) bezeichnet die Elemente des FeldausschnittsGültiger Bereich heisst: hier “leben” wirklich Feldelemente[begin, end) ist leer, wenn begin == end
484
![Page 38: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/38.jpg)
Felder in Funktionen
Konvention der Standard-Bibliothek: Übergabe eines Feldes (odereines Feldausschnitts) mit zwei Zeigern:
begin: Zeiger auf das erste Elementend: Zeiger hinter das letzte Element
[begin, end) bezeichnet die Elemente des FeldausschnittsGültiger Bereich heisst: hier “leben” wirklich Feldelemente[begin, end) ist leer, wenn begin == end
484
![Page 39: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/39.jpg)
Felder in Funktionen
Konvention der Standard-Bibliothek: Übergabe eines Feldes (odereines Feldausschnitts) mit zwei Zeigern:
begin: Zeiger auf das erste Elementend: Zeiger hinter das letzte Element[begin, end) bezeichnet die Elemente des Feldausschnitts
Gültiger Bereich heisst: hier “leben” wirklich Feldelemente[begin, end) ist leer, wenn begin == end
484
![Page 40: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/40.jpg)
Felder in Funktionen
Konvention der Standard-Bibliothek: Übergabe eines Feldes (odereines Feldausschnitts) mit zwei Zeigern:
begin: Zeiger auf das erste Elementend: Zeiger hinter das letzte Element[begin, end) bezeichnet die Elemente des FeldausschnittsGültiger Bereich heisst: hier “leben” wirklich Feldelemente
[begin, end) ist leer, wenn begin == end
484
![Page 41: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/41.jpg)
Felder in Funktionen
Konvention der Standard-Bibliothek: Übergabe eines Feldes (odereines Feldausschnitts) mit zwei Zeigern:
begin: Zeiger auf das erste Elementend: Zeiger hinter das letzte Element[begin, end) bezeichnet die Elemente des FeldausschnittsGültiger Bereich heisst: hier “leben” wirklich Feldelemente[begin, end) ist leer, wenn begin == end
484
![Page 42: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/42.jpg)
Felder in Funktionen: fill
// PRE: [begin, end) ist ein gueltiger Bereich// POST: Jedes Element in [begin, end) wird auf value gesetztvoid fill (int* begin, int* end, int value) {
for (int* p = begin; p != end; ++p)*p = value;
}...
int a[5];fill (a, a+5, 1);for (int i=0; i<5; ++i)
std::cout << a[i] << " "; // 1 1 1 1 1
485
![Page 43: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/43.jpg)
Felder in Funktionen: fill
// PRE: [begin, end) ist ein gueltiger Bereich// POST: Jedes Element in [begin, end) wird auf value gesetztvoid fill (int* begin, int* end, int value) {
for (int* p = begin; p != end; ++p)*p = value;
}...
int a[5];fill (a, a+5, 1);for (int i=0; i<5; ++i)
std::cout << a[i] << " "; // 1 1 1 1 1
Feld-nach-Zeiger-Konversion
485
![Page 44: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/44.jpg)
Felder in Funktionen: fill
// PRE: [begin, end) ist ein gueltiger Bereich// POST: Jedes Element in [begin, end) wird auf value gesetztvoid fill (int* begin, int* end, int value) {
for (int* p = begin; p != end; ++p)*p = value;
}...
int a[5];fill (a, a+5, 1);for (int i=0; i<5; ++i)
std::cout << a[i] << " "; // 1 1 1 1 1
Erwartet Zeiger auf das erste Elementeines Bereichs
485
![Page 45: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/45.jpg)
Felder in Funktionen: fill
// PRE: [begin, end) ist ein gueltiger Bereich// POST: Jedes Element in [begin, end) wird auf value gesetztvoid fill (int* begin, int* end, int value) {
for (int* p = begin; p != end; ++p)*p = value;
}...
int a[5];fill (a, a+5, 1);for (int i=0; i<5; ++i)
std::cout << a[i] << " "; // 1 1 1 1 1
Erwartet Zeiger auf das erste Elementeines Bereichs
Übergabe der Adresse (des ersten Ele-ments) von a
485
![Page 46: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/46.jpg)
Mutierende Funktionen
Zeiger können (wie auch Referenzen) für Funktionen mit Effektverwendet werden.
Beispielint a[5];fill(a, a+5, 1); // verändert a
Übergabe der Adresse (des ersten Elements) von a
Übergabe der Adresse des Elements hinter a
490
![Page 47: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/47.jpg)
Mutierende Funktionen
Zeiger können (wie auch Referenzen) für Funktionen mit Effektverwendet werden.
Beispielint a[5];fill(a, a+5, 1); // verändert a
Übergabe der Adresse (des ersten Elements) von a
Übergabe der Adresse des Elements hinter a
490
![Page 48: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/48.jpg)
Mutierende Funktionen
Zeiger können (wie auch Referenzen) für Funktionen mit Effektverwendet werden.
Beispielint a[5];fill(a, a+5, 1); // verändert a
Übergabe der Adresse (des ersten Elements) von a
Übergabe der Adresse des Elements hinter a
490
![Page 49: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/49.jpg)
Nicht-mutierende Funktionen// PRE: [begin , end) is a valid and nonempty range// POST: the smallest value in [begin, end) is returnedint min ( int∗ begin , int∗ end){
assert (begin != end);int m = ∗begin; // current minimum candidatefor ( int∗ p = ++begin; p != end; ++p)
if (∗p < m) m = ∗p;return m;
}
Kennzeichnung mit const
const bezieht sich auf int,nicht auf den Zeiger.
491
![Page 50: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/50.jpg)
Nicht-mutierende Funktionen// PRE: [begin , end) is a valid and nonempty range// POST: the smallest value in [begin, end) is returnedint min ( int∗ begin , int∗ end){
assert (begin != end);int m = ∗begin; // current minimum candidatefor ( int∗ p = ++begin; p != end; ++p)
if (∗p < m) m = ∗p;return m;
}
Kennzeichnung mit const
const bezieht sich auf int,nicht auf den Zeiger.
491
![Page 51: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/51.jpg)
Nicht-mutierende Funktionen// PRE: [begin , end) is a valid and nonempty range// POST: the smallest value in [begin, end) is returnedint min (const int∗ begin ,const int∗ end){
assert (begin != end);int m = ∗begin; // current minimum candidatefor (const int∗ p = ++begin; p != end; ++p)
if (∗p < m) m = ∗p;return m;
}
Kennzeichnung mit const
const bezieht sich auf int,nicht auf den Zeiger.
491
![Page 52: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/52.jpg)
Const und Zeiger
const T ist äquivalent zu T const und kann auch so geschriebenwerden
const int a; ⇐⇒ int const a;const int* a; ⇐⇒ int const *a;
492
![Page 53: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/53.jpg)
Const und Zeiger
Lies Deklaration von rechts nach links
int const a; a ist eine konstante Ganzzahl
492
![Page 54: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/54.jpg)
Const und Zeiger
Lies Deklaration von rechts nach links
int const* a; a ist ein Zeiger auf eine konstanteGanzzahl
492
![Page 55: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/55.jpg)
Const und Zeiger
Lies Deklaration von rechts nach links
int* const a; a ist ein konstanter Zeiger auf eineGanzzahl
492
![Page 56: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/56.jpg)
Const und Zeiger
Lies Deklaration von rechts nach links
int const* const a; a ist ein konstanter Zeiger auf einekonstante Ganzzahl
492
![Page 57: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/57.jpg)
Wow – Palindrome!// PRE: [begin end) is a valid range of characters// POST: returns true if the range forms a palindromebool is_palindrome (const char∗ begin, const char∗ end) {
while (begin < end)if (*(begin++) != *(--end)) return false;
return true;}
R O T O R
begin end
494
![Page 58: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/58.jpg)
Wow – Palindrome!// PRE: [begin end) is a valid range of characters// POST: returns true if the range forms a palindromebool is_palindrome (const char∗ begin, const char∗ end) {
while (begin < end)if (*(begin++) != *(--end)) return false;
return true;}
R O T O R
begin end
begin end
494
![Page 59: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/59.jpg)
Wow – Palindrome!// PRE: [begin end) is a valid range of characters// POST: returns true if the range forms a palindromebool is_palindrome (const char∗ begin, const char∗ end) {
while (begin < end)if (*(begin++) != *(--end)) return false;
return true;}
R O T O R
begin end
begin end
494
![Page 60: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/60.jpg)
Wow – Palindrome!// PRE: [begin end) is a valid range of characters// POST: returns true if the range forms a palindromebool is_palindrome (const char∗ begin, const char∗ end) {
while (begin < end)if (*(begin++) != *(--end)) return false;
return true;}
R O T O R
begin end
begin end
494
![Page 61: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/61.jpg)
Wow – Palindrome!// PRE: [begin end) is a valid range of characters// POST: returns true if the range forms a palindromebool is_palindrome (const char∗ begin, const char∗ end) {
while (begin < end)if (*(begin++) != *(--end)) return false;
return true;}
R O T O R
begin end
begin end
494
![Page 62: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/62.jpg)
Wow – Palindrome!// PRE: [begin end) is a valid range of characters// POST: returns true if the range forms a palindromebool is_palindrome (const char∗ begin, const char∗ end) {
while (begin < end)if (*(begin++) != *(--end)) return false;
return true;}
R O T O R
begin end
begin end
494
![Page 63: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/63.jpg)
Wow – Palindrome!// PRE: [begin end) is a valid range of characters// POST: returns true if the range forms a palindromebool is_palindrome (const char∗ begin, const char∗ end) {
while (begin < end)if (*(begin++) != *(--end)) return false;
return true;}
R O T O R
begin end
begin end
494
![Page 64: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/64.jpg)
Wow – Palindrome!// PRE: [begin end) is a valid range of characters// POST: returns true if the range forms a palindromebool is_palindrome (const char∗ begin, const char∗ end) {
while (begin < end)if (*(begin++) != *(--end)) return false;
return true;}
R O T O R
begin end
begin == end
494
![Page 65: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/65.jpg)
Wow – Palindrome!// PRE: [begin end) is a valid range of characters// POST: returns true if the range forms a palindromebool is_palindrome (const char∗ begin, const char∗ end) {
while (begin < end)if (*(begin++) != *(--end)) return false;
return true;}
R O T O R
begin end
begin == end
494
![Page 66: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/66.jpg)
Wow – Palindrome!// PRE: [begin end) is a valid range of characters// POST: returns true if the range forms a palindromebool is_palindrome (const char∗ begin, const char∗ end) {
while (begin < end)if (*(begin++) != *(--end)) return false;
return true;}
R O T O R
begin end
begin == end
494
![Page 67: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/67.jpg)
Algorithmen
Für viele alltägliche Probleme existieren vorgefertigte Lösungen inder Standardbibliothek.Beispiel: Füllen eines Feldes
#include <algorithm> // needed for std::fill...
int a[5];std::fill (a, a+5, 1);
for (int i=0; i<5; ++i)std::cout << a[i] << " "; // 1 1 1 1 1
495
![Page 68: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/68.jpg)
Algorithmen
Die gleichen vorgefertigten Algorithmen funktionieren für vieleverschiedene Datentypen.
Beispiel: Füllen eines Feldes
#include <algorithm> // needed for std::fill...
char c[3];std::fill (c, c+3, ’!’);
for (int i=0; i<3; ++i)std::cout << c[i]; // !!!
497
![Page 69: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/69.jpg)
Exkurs: TemplatesBeispiel: fill mit Templates
template <typename T>void fill (T∗ begin , T∗ end, T value) {
for (T∗ p = begin; p != end; ++p)∗p = value;
}int a[5];fill (a, a+5, 1); // 1 1 1 1 1
char c[3];fill (c, c+3, ’!’); // !!!
Die eckigen Klammern kennen wirschon von std::vector<int>. Vek-toren sind auch als Templates realisiert.
Auch std::fill ist als Template realisiert!
498
![Page 70: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/70.jpg)
Exkurs: TemplatesBeispiel: fill mit Templates
template <typename T>void fill (T∗ begin , T∗ end, T value) {
for (T∗ p = begin; p != end; ++p)∗p = value;
}int a[5];fill (a, a+5, 1); // 1 1 1 1 1
char c[3];fill (c, c+3, ’!’); // !!!
Die eckigen Klammern kennen wirschon von std::vector<int>. Vek-toren sind auch als Templates realisiert.
Auch std::fill ist als Template realisiert!
498
![Page 71: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/71.jpg)
Exkurs: TemplatesBeispiel: fill mit Templates
template <typename T>void fill (T∗ begin , T∗ end, T value) {
for (T∗ p = begin; p != end; ++p)∗p = value;
}int a[5];fill (a, a+5, 1); // 1 1 1 1 1
char c[3];fill (c, c+3, ’!’); // !!!
Die eckigen Klammern kennen wirschon von std::vector<int>. Vek-toren sind auch als Templates realisiert.
Auch std::fill ist als Template realisiert!498
![Page 72: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/72.jpg)
Container und Traversierung
Container: Behälter (Feld, Vektor,. . . ) für Elemente
Traversierung: Durchlaufen eines Containers
Initialisierung der Elemente (fill)Suchen des kleinsten Elements (min)Prüfen von Eigenschaften (is_palindrome)· · ·
Es gibt noch viele andere Container (Mengen, Listen,. . . )
499
![Page 73: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/73.jpg)
Container und Traversierung
Container: Behälter (Feld, Vektor,. . . ) für ElementeTraversierung: Durchlaufen eines Containers
Initialisierung der Elemente (fill)Suchen des kleinsten Elements (min)Prüfen von Eigenschaften (is_palindrome)· · ·
Es gibt noch viele andere Container (Mengen, Listen,. . . )
499
![Page 74: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/74.jpg)
Container und Traversierung
Container: Behälter (Feld, Vektor,. . . ) für ElementeTraversierung: Durchlaufen eines Containers
Initialisierung der Elemente (fill)
Suchen des kleinsten Elements (min)Prüfen von Eigenschaften (is_palindrome)· · ·
Es gibt noch viele andere Container (Mengen, Listen,. . . )
499
![Page 75: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/75.jpg)
Container und Traversierung
Container: Behälter (Feld, Vektor,. . . ) für ElementeTraversierung: Durchlaufen eines Containers
Initialisierung der Elemente (fill)Suchen des kleinsten Elements (min)
Prüfen von Eigenschaften (is_palindrome)· · ·
Es gibt noch viele andere Container (Mengen, Listen,. . . )
499
![Page 76: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/76.jpg)
Container und Traversierung
Container: Behälter (Feld, Vektor,. . . ) für ElementeTraversierung: Durchlaufen eines Containers
Initialisierung der Elemente (fill)Suchen des kleinsten Elements (min)Prüfen von Eigenschaften (is_palindrome)
· · ·
Es gibt noch viele andere Container (Mengen, Listen,. . . )
499
![Page 77: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/77.jpg)
Container und Traversierung
Container: Behälter (Feld, Vektor,. . . ) für ElementeTraversierung: Durchlaufen eines Containers
Initialisierung der Elemente (fill)Suchen des kleinsten Elements (min)Prüfen von Eigenschaften (is_palindrome)· · ·
Es gibt noch viele andere Container (Mengen, Listen,. . . )
499
![Page 78: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/78.jpg)
Container und Traversierung
Container: Behälter (Feld, Vektor,. . . ) für ElementeTraversierung: Durchlaufen eines Containers
Initialisierung der Elemente (fill)Suchen des kleinsten Elements (min)Prüfen von Eigenschaften (is_palindrome)· · ·
Es gibt noch viele andere Container (Mengen, Listen,. . . )
499
![Page 79: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/79.jpg)
Werkzeuge zur Traversierung
Felder: Indizes (wahlfrei) oder Zeiger (natürlich)
Feld-Algorithmen (std::) benutzen Zeigerint a[5];std::fill (a, a+5, 1); // 1 1 1 1 1
Wie traversiert man Vektoren und andere Container?std::vector<int> v (5, 0); // 0 0 0 0 0std::fill (?, ?, 1); // 1 1 1 1 1
500
![Page 80: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/80.jpg)
Werkzeuge zur Traversierung
Felder: Indizes (wahlfrei) oder Zeiger (natürlich)Feld-Algorithmen (std::) benutzen Zeiger
int a[5];std::fill (a, a+5, 1); // 1 1 1 1 1
Wie traversiert man Vektoren und andere Container?std::vector<int> v (5, 0); // 0 0 0 0 0std::fill (?, ?, 1); // 1 1 1 1 1
500
![Page 81: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/81.jpg)
Werkzeuge zur Traversierung
Felder: Indizes (wahlfrei) oder Zeiger (natürlich)Feld-Algorithmen (std::) benutzen Zeiger
int a[5];std::fill (a, a+5, 1); // 1 1 1 1 1
Wie traversiert man Vektoren und andere Container?std::vector<int> v (5, 0); // 0 0 0 0 0std::fill (?, ?, 1); // 1 1 1 1 1
500
![Page 82: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/82.jpg)
Vektoren: too sexy for pointers
Unser fill mit Templates funktioniert für Vektoren nicht. . .
. . . und std::fill so auch nicht:std::vector<int> v (5, 0);std::fill (v, v+5, 1); // Fehlermeldung des Compilers !
Vektoren sind was Besseres. . .
Sie lassen sich weder in Zeiger konvertieren,. . .. . . noch mit Zeigern traversieren.Das ist ihnen viel zu primitiv.
501
![Page 83: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/83.jpg)
Vektoren: too sexy for pointers
Unser fill mit Templates funktioniert für Vektoren nicht. . .. . . und std::fill so auch nicht:
std::vector<int> v (5, 0);std::fill (v, v+5, 1); // Fehlermeldung des Compilers !
Vektoren sind was Besseres. . .
Sie lassen sich weder in Zeiger konvertieren,. . .. . . noch mit Zeigern traversieren.Das ist ihnen viel zu primitiv.
501
![Page 84: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/84.jpg)
Vektoren: too sexy for pointers
Unser fill mit Templates funktioniert für Vektoren nicht. . .. . . und std::fill so auch nicht:
std::vector<int> v (5, 0);std::fill (v, v+5, 1); // Fehlermeldung des Compilers !
Vektoren sind was Besseres. . .
Sie lassen sich weder in Zeiger konvertieren,. . .. . . noch mit Zeigern traversieren.Das ist ihnen viel zu primitiv.
501
![Page 85: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/85.jpg)
Vektoren: too sexy for pointers
Unser fill mit Templates funktioniert für Vektoren nicht. . .. . . und std::fill so auch nicht:
std::vector<int> v (5, 0);std::fill (v, v+5, 1); // Fehlermeldung des Compilers !
Vektoren sind was Besseres. . .
Sie lassen sich weder in Zeiger konvertieren,. . .
. . . noch mit Zeigern traversieren.Das ist ihnen viel zu primitiv.
501
![Page 86: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/86.jpg)
Vektoren: too sexy for pointers
Unser fill mit Templates funktioniert für Vektoren nicht. . .. . . und std::fill so auch nicht:
std::vector<int> v (5, 0);std::fill (v, v+5, 1); // Fehlermeldung des Compilers !
Vektoren sind was Besseres. . .
Sie lassen sich weder in Zeiger konvertieren,. . .. . . noch mit Zeigern traversieren.
Das ist ihnen viel zu primitiv.
501
![Page 87: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/87.jpg)
Vektoren: too sexy for pointers
Unser fill mit Templates funktioniert für Vektoren nicht. . .. . . und std::fill so auch nicht:
std::vector<int> v (5, 0);std::fill (v, v+5, 1); // Fehlermeldung des Compilers !
Vektoren sind was Besseres. . .
Sie lassen sich weder in Zeiger konvertieren,. . .. . . noch mit Zeigern traversieren.Das ist ihnen viel zu primitiv.
501
![Page 88: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/88.jpg)
Auch im Speicher: Vektor 6= Feldbool a[8] = {true, true, true, true, true, true, true, true};
true
8 Byte
true
8 Byte
true
8 Byte
true
8 Byte
true
8 Byte
true
8 Byte
true
8 Byte
true
8 Byte
std::vector<bool> v (8, true);
0b11111111 1 Byte
bool*-Zeiger passt hier nicht, denn erläuft byteweise, nicht bitweise!
502
![Page 89: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/89.jpg)
Auch im Speicher: Vektor 6= Feldbool a[8] = {true, true, true, true, true, true, true, true};
true
8 Byte
true
8 Byte
true
8 Byte
true
8 Byte
true
8 Byte
true
8 Byte
true
8 Byte
true
8 Byte
std::vector<bool> v (8, true);
0b11111111 1 Byte
bool*-Zeiger passt hier nicht, denn erläuft byteweise, nicht bitweise!
502
![Page 90: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/90.jpg)
Auch im Speicher: Vektor 6= Feldbool a[8] = {true, true, true, true, true, true, true, true};
true
8 Byte
true
8 Byte
true
8 Byte
true
8 Byte
true
8 Byte
true
8 Byte
true
8 Byte
true
8 Byte
std::vector<bool> v (8, true);
0b11111111 1 Bytebool*-Zeiger passt hier nicht, denn erläuft byteweise, nicht bitweise!
502
![Page 91: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/91.jpg)
Vektor-IteratorenIterator: ein “Zeiger”, der zum Container passt.
Beispiel: Füllen eines Vektors mit std::fill – so geht’s!
#include <vector>#include <algorithm> // needed for std::fill
...std::vector<int> v(5, 0);std::fill (v.begin(), v.end(), 1);for (int i=0; i<5; ++i)
std::cout << v[i] << " "; // 1 1 1 1 1
503
![Page 92: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/92.jpg)
Vektor-IteratorenIterator: ein “Zeiger”, der zum Container passt.
Beispiel: Füllen eines Vektors mit std::fill – so geht’s!
#include <vector>#include <algorithm> // needed for std::fill
...std::vector<int> v(5, 0);std::fill (v.begin(), v.end(), 1);for (int i=0; i<5; ++i)
std::cout << v[i] << " "; // 1 1 1 1 1
503
![Page 93: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/93.jpg)
Vektor-Iteratoren
Für jeden Vektor sind zwei Iterator-Typen definiert.
std::vector<int>::const_iterator
für nicht-mutierenden Zugriffanalog zu const int* für Felder
std::vector<int>::iterator
für mutierenden Zugriffanalog zu int* für Felder
504
![Page 94: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/94.jpg)
Vektor-Iteratoren
Für jeden Vektor sind zwei Iterator-Typen definiert.
std::vector<int>::const_iterator
für nicht-mutierenden Zugriff
analog zu const int* für Felder
std::vector<int>::iterator
für mutierenden Zugriffanalog zu int* für Felder
504
![Page 95: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/95.jpg)
Vektor-Iteratoren
Für jeden Vektor sind zwei Iterator-Typen definiert.
std::vector<int>::const_iterator
für nicht-mutierenden Zugriffanalog zu const int* für Felder
std::vector<int>::iterator
für mutierenden Zugriffanalog zu int* für Felder
504
![Page 96: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/96.jpg)
Vektor-Iteratoren
Für jeden Vektor sind zwei Iterator-Typen definiert.
std::vector<int>::const_iterator
für nicht-mutierenden Zugriffanalog zu const int* für Felder
std::vector<int>::iterator
für mutierenden Zugriffanalog zu int* für Felder
504
![Page 97: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/97.jpg)
Vektor-Iteratoren
Für jeden Vektor sind zwei Iterator-Typen definiert.
std::vector<int>::const_iterator
für nicht-mutierenden Zugriffanalog zu const int* für Felder
std::vector<int>::iterator
für mutierenden Zugriff
analog zu int* für Felder
504
![Page 98: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/98.jpg)
Vektor-Iteratoren
Für jeden Vektor sind zwei Iterator-Typen definiert.
std::vector<int>::const_iterator
für nicht-mutierenden Zugriffanalog zu const int* für Felder
std::vector<int>::iterator
für mutierenden Zugriffanalog zu int* für Felder
504
![Page 99: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/99.jpg)
Vektor-Iteratoren: begin() und end()
v.begin() zeigt auf das erste Element von vv.end() zeigt hinter das letzte Element von v
505
![Page 100: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/100.jpg)
Vektor-Iteratoren: begin() und end()
v.begin() zeigt auf das erste Element von vv.end() zeigt hinter das letzte Element von v
505
![Page 101: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/101.jpg)
Vektor-Iteratoren: begin() und end()
Damit können wir einen Vektor traversieren. . .
for (std::vector<int>::const_iterator it = v.begin();it != v.end(); ++it)
std::cout << ∗it << " ";
. . . oder einen Vektor füllen.
std::fill (v.begin(), v.end(), 1);
505
![Page 102: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/102.jpg)
Vektor-Iteratoren: begin() und end()
Damit können wir einen Vektor traversieren. . .
for (std::vector<int>::const_iterator it = v.begin();it != v.end(); ++it)
std::cout << ∗it << " ";
. . . oder einen Vektor füllen.
std::fill (v.begin(), v.end(), 1);
505
![Page 103: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/103.jpg)
Typnamen in C++ konnen laaaaaaaang werden
std::vector<int>::const_iterator
Dann hilft die Deklaration eines Typ-Alias mit
typedef Typ Name;
Beispieletypedef std::vector<int> int_vec;typedef int_vec::const_iterator Cvit;
506
![Page 104: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/104.jpg)
Typnamen in C++ konnen laaaaaaaang werden
std::vector<int>::const_iteratorDann hilft die Deklaration eines Typ-Alias mit
typedef Typ Name;
bestehender Typ Name, unter dem der Typneu auch angesprochenwerden kann
Beispieletypedef std::vector<int> int_vec;typedef int_vec::const_iterator Cvit;
506
![Page 105: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/105.jpg)
Typnamen in C++ konnen laaaaaaaang werden
std::vector<int>::const_iteratorDann hilft die Deklaration eines Typ-Alias mit
typedef Typ Name;
bestehender Typ Name, unter dem der Typneu auch angesprochenwerden kannBeispiele
typedef std::vector<int> int_vec;typedef int_vec::const_iterator Cvit;
506
![Page 106: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/106.jpg)
Vektor-Iteratoren funktionieren wie Zeiger
typedef std::vector<int>::const_iterator Cvit;
std::vector<int> v(5, 0); // 0 0 0 0 0
// output all elements of a, using iterationfor (Cvit it = v.begin(); it != v.end(); ++it)
std::cout << *it << " ";
Vektor-Element,auf das it zeigt
507
![Page 107: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/107.jpg)
Vektor-Iteratoren funktionieren wie Zeiger
typedef std::vector<int>::const_iterator Cvit;
std::vector<int> v(5, 0); // 0 0 0 0 0
// output all elements of a, using iterationfor (Cvit it = v.begin(); it != v.end(); ++it)
std::cout << *it << " ";
Vektor-Element,auf das it zeigt
507
![Page 108: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/108.jpg)
Vektor-Iteratoren funktionieren wie Zeiger
typedef std::vector<int>::iterator Vit;
// manually set all elements to 1for (Vit it = v.begin(); it != v.end(); ++it)∗it = 1;
// output all elements again, using random accessfor (int i=0; i<5; ++i)
std::cout << v[i] << " ";
Inkrementieren des Iterators
Kurzschreibweise für*(v.begin()+i)
508
![Page 109: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/109.jpg)
Vektor-Iteratoren funktionieren wie Zeiger
typedef std::vector<int>::iterator Vit;
// manually set all elements to 1for (Vit it = v.begin(); it != v.end(); ++it)∗it = 1;
// output all elements again, using random accessfor (int i=0; i<5; ++i)
std::cout << v[i] << " ";
Inkrementieren des Iterators
Kurzschreibweise für*(v.begin()+i)
508
![Page 110: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/110.jpg)
Andere Container: Mengen (Sets)
Eine Menge ist eine ungeordnete Zusammenfassung vonElementen, wobei jedes Element nur einmal vorkommt.
{1, 2, 1} = {1, 2} = {2, 1}
C++: std::set<T> für eine Menge mit Elementen vom Typ T
509
![Page 111: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/111.jpg)
Andere Container: Mengen (Sets)
Eine Menge ist eine ungeordnete Zusammenfassung vonElementen, wobei jedes Element nur einmal vorkommt.
{1, 2, 1} = {1, 2} = {2, 1}C++: std::set<T> für eine Menge mit Elementen vom Typ T
509
![Page 112: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/112.jpg)
Mengen: Beispiel einer Anwendung
Stelle fest, ob ein gegebener Text ein Fragezeichen enthält undgib alle im Text vorkommenden verschiedenen Zeichen aus!
510
![Page 113: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/113.jpg)
Buchstabensalat (1)
#include<set>...typedef std::set<char>::const_iterator Csit;...std::string text ="What are the distinct characters in this string?";
std::set<char> s (text.begin(),text.end());
Menge wird mit String-Iterator-Bereich[text.begin(), text.end()) initialisiert
511
![Page 114: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/114.jpg)
Buchstabensalat (1)
#include<set>...typedef std::set<char>::const_iterator Csit;...std::string text ="What are the distinct characters in this string?";
std::set<char> s (text.begin(),text.end());
Menge wird mit String-Iterator-Bereich[text.begin(), text.end()) initialisiert
511
![Page 115: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/115.jpg)
Buchstabensalat (2)
// check whether text contains a question markif (std::find (s.begin(), s.end(), ’?’) != s.end())
std::cout << "Good question!\n";
// output all distinct charactersfor (Csit it = s.begin(); it != s.end(); ++it)
std::cout << ∗it;
Suchalgorithmus, aufrufbar mit beliebigemIterator-Bereich
Ausgabe:Good question!?Wacdeghinrst
512
![Page 116: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/116.jpg)
Buchstabensalat (2)
// check whether text contains a question markif (std::find (s.begin(), s.end(), ’?’) != s.end())
std::cout << "Good question!\n";
// output all distinct charactersfor (Csit it = s.begin(); it != s.end(); ++it)
std::cout << ∗it;
Suchalgorithmus, aufrufbar mit beliebigemIterator-Bereich
Ausgabe:Good question!?Wacdeghinrst
512
![Page 117: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/117.jpg)
Buchstabensalat (2)
// check whether text contains a question markif (std::find (s.begin(), s.end(), ’?’) != s.end())
std::cout << "Good question!\n";
// output all distinct charactersfor (Csit it = s.begin(); it != s.end(); ++it)
std::cout << ∗it;
Suchalgorithmus, aufrufbar mit beliebigemIterator-Bereich
Ausgabe:Good question!?Wacdeghinrst
512
![Page 118: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/118.jpg)
Mengen und Indizes?
Kann man Mengen mit wahlfreiem Zugriff traversieren?
for (int i=0; i<s.size(); ++i)std::cout << s[i];
513
![Page 119: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/119.jpg)
Mengen und Indizes?
Kann man Mengen mit wahlfreiem Zugriff traversieren?
for (int i=0; i<s.size(); ++i)std::cout << s[i];
513
![Page 120: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/120.jpg)
Mengen und Indizes?
Kann man Mengen mit wahlfreiem Zugriff traversieren?
for (int i=0; i<s.size(); ++i)std::cout << s[i];
Fehlermeldung: no subscript operator
513
![Page 121: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/121.jpg)
Mengen und Indizes?
Kann man Mengen mit wahlfreiem Zugriff traversieren? Nein.
for (int i=0; i<s.size(); ++i)std::cout << s[i];
Fehlermeldung: no subscript operator
Mengen sind ungeordnet.
Es gibt kein “i-tes Element”.
513
![Page 122: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/122.jpg)
Mengen und Indizes?
Kann man Mengen mit wahlfreiem Zugriff traversieren? Nein.
for (int i=0; i<s.size(); ++i)std::cout << s[i];
Fehlermeldung: no subscript operator
Mengen sind ungeordnet.
Es gibt kein “i-tes Element”.Iteratorvergleich it != s.end() geht, nicht aber it < s.end()!
513
![Page 123: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/123.jpg)
Das Konzept der Iteratoren
C++kennt verschiedene Iterator-Typen
Jeder Container hat einen zugehörigen Iterator-TypAlle können dereferenzieren (*it) und traversieren (++it)Manche können mehr, z.B. wahlfreien Zugriff (it[k], oderäquivalent *(it + k)), rückwärts traversieren (--it),. . .
514
![Page 124: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/124.jpg)
Das Konzept der Iteratoren
C++kennt verschiedene Iterator-Typen
Jeder Container hat einen zugehörigen Iterator-Typ
Alle können dereferenzieren (*it) und traversieren (++it)Manche können mehr, z.B. wahlfreien Zugriff (it[k], oderäquivalent *(it + k)), rückwärts traversieren (--it),. . .
514
![Page 125: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/125.jpg)
Das Konzept der Iteratoren
C++kennt verschiedene Iterator-Typen
Jeder Container hat einen zugehörigen Iterator-TypAlle können dereferenzieren (*it) und traversieren (++it)
Manche können mehr, z.B. wahlfreien Zugriff (it[k], oderäquivalent *(it + k)), rückwärts traversieren (--it),. . .
514
![Page 126: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/126.jpg)
Das Konzept der Iteratoren
C++kennt verschiedene Iterator-Typen
Jeder Container hat einen zugehörigen Iterator-TypAlle können dereferenzieren (*it) und traversieren (++it)Manche können mehr, z.B. wahlfreien Zugriff (it[k], oderäquivalent *(it + k)), rückwärts traversieren (--it),. . .
514
![Page 127: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/127.jpg)
Das Konzept der Iteratoren
Jeder Container-Algorithmus der Standardbibliothek ist generisch.Das heisst:
Der Container wird per Iterator-Bereich übergebenDer Algorithmus funktioniert für alle Container, deren Iteratorendie Anforderungen des Algorithmus erfüllen
std::find erfordert z.B. nur * und ++Implementationsdetails des Containers sind nicht von Bedeutung
515
![Page 128: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/128.jpg)
Das Konzept der Iteratoren
Jeder Container-Algorithmus der Standardbibliothek ist generisch.Das heisst:
Der Container wird per Iterator-Bereich übergeben
Der Algorithmus funktioniert für alle Container, deren Iteratorendie Anforderungen des Algorithmus erfüllen
std::find erfordert z.B. nur * und ++Implementationsdetails des Containers sind nicht von Bedeutung
515
![Page 129: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/129.jpg)
Das Konzept der Iteratoren
Jeder Container-Algorithmus der Standardbibliothek ist generisch.Das heisst:
Der Container wird per Iterator-Bereich übergebenDer Algorithmus funktioniert für alle Container, deren Iteratorendie Anforderungen des Algorithmus erfüllen
std::find erfordert z.B. nur * und ++Implementationsdetails des Containers sind nicht von Bedeutung
515
![Page 130: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/130.jpg)
Das Konzept der Iteratoren
Jeder Container-Algorithmus der Standardbibliothek ist generisch.Das heisst:
Der Container wird per Iterator-Bereich übergebenDer Algorithmus funktioniert für alle Container, deren Iteratorendie Anforderungen des Algorithmus erfüllen
std::find erfordert z.B. nur * und ++
Implementationsdetails des Containers sind nicht von Bedeutung
515
![Page 131: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/131.jpg)
Das Konzept der Iteratoren
Jeder Container-Algorithmus der Standardbibliothek ist generisch.Das heisst:
Der Container wird per Iterator-Bereich übergebenDer Algorithmus funktioniert für alle Container, deren Iteratorendie Anforderungen des Algorithmus erfüllen
std::find erfordert z.B. nur * und ++Implementationsdetails des Containers sind nicht von Bedeutung
515
![Page 132: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/132.jpg)
15. Rekursion 1
Mathematische Rekursion, Terminierung, der Aufrufstapel,Beispiele, Rekursion vs. Iteration
520
![Page 133: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/133.jpg)
Mathematische Rekursion
Viele mathematische Funktionen sind sehr natürlich rekursivdefinierbar.
Das heisst, die Funktion erscheint in ihrer eigenen Definition.
n! =
{1, falls n ≤ 1
n · (n− 1)!, andernfalls
521
![Page 134: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/134.jpg)
Mathematische Rekursion
Viele mathematische Funktionen sind sehr natürlich rekursivdefinierbar.Das heisst, die Funktion erscheint in ihrer eigenen Definition.
n! =
{1, falls n ≤ 1
n · (n− 1)!, andernfalls
521
![Page 135: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/135.jpg)
Rekursion in C++: Genauso!
n! =
{1, falls n ≤ 1
n · (n− 1)!, andernfalls
// POST: return value is n!unsigned int fac (unsigned int n){
if (n <= 1)return 1;
elsereturn n * fac (n-1);
}522
![Page 136: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/136.jpg)
Unendliche Rekursion
ist so schlecht wie eine Endlosschleife. . .
. . . nur noch schlechter (“verbrennt” Zeit und Speicher)
void f(){
f(); // f() -> f() -> ... stack overflow}
523
![Page 137: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/137.jpg)
Unendliche Rekursion
ist so schlecht wie eine Endlosschleife. . .. . . nur noch schlechter (“verbrennt” Zeit und Speicher)
void f(){
f(); // f() -> f() -> ... stack overflow}
523
![Page 138: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/138.jpg)
Unendliche Rekursion
ist so schlecht wie eine Endlosschleife. . .. . . nur noch schlechter (“verbrennt” Zeit und Speicher)
void f(){
f(); // f() -> f() -> ... stack overflow}
523
![Page 139: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/139.jpg)
Unendliche Rekursion
ist so schlecht wie eine Endlosschleife. . .. . . nur noch schlechter (“verbrennt” Zeit und Speicher)
void f(){
f(); // f() -> f() -> ... stack overflow}
Ein Euro ist ein Euro.
Wim Duisenberg, erster Präsident der EZB
523
![Page 140: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/140.jpg)
Unendliche Rekursion
ist so schlecht wie eine Endlosschleife. . .. . . nur noch schlechter (“verbrennt” Zeit und Speicher)
void f(){
f(); // f() -> f() -> ... stack overflow}
Mir san mir.
Bayerisches Lebensmotto
523
![Page 141: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/141.jpg)
Rekursive Funktionen: Terminierung
Wie bei Schleifen brauchen wir
Fortschritt Richtung Terminierung
fac(n):terminiert sofort für n ≤ 1, andernfalls wird die Funktion rekursiv mitArgument < n aufgerufen.
„n wird mit jedem Aufruf kleiner.”
524
![Page 142: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/142.jpg)
Rekursive Funktionen: Terminierung
Wie bei Schleifen brauchen wir
Fortschritt Richtung Terminierung
fac(n):terminiert sofort für n ≤ 1, andernfalls wird die Funktion rekursiv mitArgument < n aufgerufen.
„n wird mit jedem Aufruf kleiner.”
524
![Page 143: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/143.jpg)
Rekursive Funktionen: Terminierung
Wie bei Schleifen brauchen wir
Fortschritt Richtung Terminierung
fac(n):terminiert sofort für n ≤ 1, andernfalls wird die Funktion rekursiv mitArgument < n aufgerufen.
„n wird mit jedem Aufruf kleiner.”
524
![Page 144: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/144.jpg)
Rekursive Funktionen: Auswertung
Beispiel: fac(4)
// POST: return value is n!unsigned int fac (unsigned int n){
if (n <= 1) return 1;return n * fac(n-1); // n > 1
}
Aufruf von fac(4)525
![Page 145: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/145.jpg)
Rekursive Funktionen: Auswertung
Beispiel: fac(4)
// POST: return value is n!unsigned int fac (unsigned int n){ // n = 4
if (n <= 1) return 1;return n * fac(n-1); // n > 1
}
Initialisierung des formalen Arguments525
![Page 146: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/146.jpg)
Rekursive Funktionen: Auswertung
Beispiel: fac(4)
// POST: return value is n!unsigned int fac (unsigned int n){ // n = 4
if (n <= 1) return 1;return n * fac(n-1); // n > 1
}
Auswertung des Rückgabeausdrucks
525
![Page 147: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/147.jpg)
Rekursive Funktionen: Auswertung
Beispiel: fac(4)
// POST: return value is n!unsigned int fac (unsigned int n){ // n = 4
if (n <= 1) return 1;return n * fac(n-1); // n > 1
}
Rekursiver Aufruf mit Argument n− 1 == 3
525
![Page 148: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/148.jpg)
Rekursive Funktionen: Auswertung
Beispiel: fac(4)
// POST: return value is n!unsigned int fac (unsigned int n){ // n = 3
if (n <= 1) return 1;return n * fac(n-1); // n > 1
}
Initialisierung des formalen Arguments525
![Page 149: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/149.jpg)
Rekursive Funktionen: Auswertung
Beispiel: fac(4)
// POST: return value is n!unsigned int fac (unsigned int n){ // n = 3
if (n <= 1) return 1;return n * fac(n-1); // n > 1
}
Initialisierung des formalen Arguments
Es gibt jetzt zwei n. Das von fac(4) und das von fac(3)
525
![Page 150: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/150.jpg)
Rekursive Funktionen: Auswertung
Beispiel: fac(4)
// POST: return value is n!unsigned int fac (unsigned int n){
if (n <= 1) return 1;return n * fac(n-1); // n > 1
}
Initialisierung des formalen Arguments
Es wird mit dem n des aktuellen Aufrufs gearbeitet: n = 3
525
![Page 151: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/151.jpg)
Der Aufrufstapel
Bei jedem Funktionsaufruf:
Wert des Aufrufarguments kommt aufeinen Stapel
Es wird immer mit dem obersten WertgearbeitetAm Ende des Aufrufs wird der obersteWert wieder vom Stapel gelöscht
std:cout < < fac(4)
n = 4
n = 3
n = 2
n = 1n = 1 1! = 1
n = 2 2 · 1! = 2
n = 3 3 · 2! = 6
n = 4 4 · 3! = 24
526
![Page 152: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/152.jpg)
Der Aufrufstapel
Bei jedem Funktionsaufruf:
Wert des Aufrufarguments kommt aufeinen Stapel
Es wird immer mit dem obersten WertgearbeitetAm Ende des Aufrufs wird der obersteWert wieder vom Stapel gelöscht
std:cout < < fac(4)
n = 4
n = 3
n = 2
n = 1n = 1 1! = 1
n = 2 2 · 1! = 2
n = 3 3 · 2! = 6
n = 4 4 · 3! = 24
fac(4)
526
![Page 153: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/153.jpg)
Der Aufrufstapel
Bei jedem Funktionsaufruf:Wert des Aufrufarguments kommt aufeinen Stapel
Es wird immer mit dem obersten WertgearbeitetAm Ende des Aufrufs wird der obersteWert wieder vom Stapel gelöscht
std:cout < < fac(4)
n = 4
n = 3
n = 2
n = 1n = 1 1! = 1
n = 2 2 · 1! = 2
n = 3 3 · 2! = 6
n = 4 4 · 3! = 24
fac(4)
526
![Page 154: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/154.jpg)
Der Aufrufstapel
Bei jedem Funktionsaufruf:Wert des Aufrufarguments kommt aufeinen Stapel
Es wird immer mit dem obersten WertgearbeitetAm Ende des Aufrufs wird der obersteWert wieder vom Stapel gelöscht
std:cout < < fac(4)
n = 4
n = 3
n = 2
n = 1n = 1 1! = 1
n = 2 2 · 1! = 2
n = 3 3 · 2! = 6
n = 4 4 · 3! = 24
fac(4)
fac(3)
526
![Page 155: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/155.jpg)
Der Aufrufstapel
Bei jedem Funktionsaufruf:Wert des Aufrufarguments kommt aufeinen Stapel
Es wird immer mit dem obersten WertgearbeitetAm Ende des Aufrufs wird der obersteWert wieder vom Stapel gelöscht
std:cout < < fac(4)
n = 4
n = 3
n = 2
n = 1n = 1 1! = 1
n = 2 2 · 1! = 2
n = 3 3 · 2! = 6
n = 4 4 · 3! = 24
fac(4)
fac(3)
526
![Page 156: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/156.jpg)
Der Aufrufstapel
Bei jedem Funktionsaufruf:Wert des Aufrufarguments kommt aufeinen Stapel
Es wird immer mit dem obersten WertgearbeitetAm Ende des Aufrufs wird der obersteWert wieder vom Stapel gelöscht
std:cout < < fac(4)
n = 4
n = 3
n = 2
n = 1n = 1 1! = 1
n = 2 2 · 1! = 2
n = 3 3 · 2! = 6
n = 4 4 · 3! = 24
fac(4)
fac(3)
fac(2)
526
![Page 157: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/157.jpg)
Der Aufrufstapel
Bei jedem Funktionsaufruf:Wert des Aufrufarguments kommt aufeinen Stapel
Es wird immer mit dem obersten WertgearbeitetAm Ende des Aufrufs wird der obersteWert wieder vom Stapel gelöscht
std:cout < < fac(4)
n = 4
n = 3
n = 2
n = 1n = 1 1! = 1
n = 2 2 · 1! = 2
n = 3 3 · 2! = 6
n = 4 4 · 3! = 24
fac(4)
fac(3)
fac(2)
526
![Page 158: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/158.jpg)
Der Aufrufstapel
Bei jedem Funktionsaufruf:Wert des Aufrufarguments kommt aufeinen Stapel
Es wird immer mit dem obersten WertgearbeitetAm Ende des Aufrufs wird der obersteWert wieder vom Stapel gelöscht
std:cout < < fac(4)
n = 4
n = 3
n = 2
n = 1n = 1 1! = 1
n = 2 2 · 1! = 2
n = 3 3 · 2! = 6
n = 4 4 · 3! = 24
fac(4)
fac(3)
fac(2)
fac(1)
526
![Page 159: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/159.jpg)
Der Aufrufstapel
Bei jedem Funktionsaufruf:Wert des Aufrufarguments kommt aufeinen Stapel
Es wird immer mit dem obersten WertgearbeitetAm Ende des Aufrufs wird der obersteWert wieder vom Stapel gelöscht
std:cout < < fac(4)
n = 4
n = 3
n = 2
n = 1
n = 1 1! = 1
n = 2 2 · 1! = 2
n = 3 3 · 2! = 6
n = 4 4 · 3! = 24
fac(4)
fac(3)
fac(2)
fac(1)
526
![Page 160: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/160.jpg)
Der Aufrufstapel
Bei jedem Funktionsaufruf:Wert des Aufrufarguments kommt aufeinen StapelEs wird immer mit dem obersten Wertgearbeitet
Am Ende des Aufrufs wird der obersteWert wieder vom Stapel gelöscht
std:cout < < fac(4)
n = 4
n = 3
n = 2
n = 1
n = 1 1! = 1
n = 2 2 · 1! = 2
n = 3 3 · 2! = 6
n = 4 4 · 3! = 24
fac(4)
fac(3)
fac(2)
fac(1)
526
![Page 161: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/161.jpg)
Der Aufrufstapel
Bei jedem Funktionsaufruf:Wert des Aufrufarguments kommt aufeinen StapelEs wird immer mit dem obersten WertgearbeitetAm Ende des Aufrufs wird der obersteWert wieder vom Stapel gelöscht
std:cout < < fac(4)
n = 4
n = 3
n = 2
n = 1
n = 1 1! = 1
n = 2 2 · 1! = 2
n = 3 3 · 2! = 6
n = 4 4 · 3! = 24
fac(4)
fac(3)
fac(2)
fac(1) 1
526
![Page 162: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/162.jpg)
Der Aufrufstapel
Bei jedem Funktionsaufruf:Wert des Aufrufarguments kommt aufeinen StapelEs wird immer mit dem obersten WertgearbeitetAm Ende des Aufrufs wird der obersteWert wieder vom Stapel gelöscht
std:cout < < fac(4)
n = 4
n = 3
n = 2
n = 1n = 1 1! = 1
n = 2 2 · 1! = 2
n = 3 3 · 2! = 6
n = 4 4 · 3! = 24
fac(4)
fac(3)
fac(2)
1
526
![Page 163: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/163.jpg)
Der Aufrufstapel
Bei jedem Funktionsaufruf:Wert des Aufrufarguments kommt aufeinen StapelEs wird immer mit dem obersten WertgearbeitetAm Ende des Aufrufs wird der obersteWert wieder vom Stapel gelöscht
std:cout < < fac(4)
n = 4
n = 3
n = 2
n = 1n = 1 1! = 1
n = 2 2 · 1! = 2
n = 3 3 · 2! = 6
n = 4 4 · 3! = 24
fac(4)
fac(3)
fac(2) 2
526
![Page 164: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/164.jpg)
Der Aufrufstapel
Bei jedem Funktionsaufruf:Wert des Aufrufarguments kommt aufeinen StapelEs wird immer mit dem obersten WertgearbeitetAm Ende des Aufrufs wird der obersteWert wieder vom Stapel gelöscht
std:cout < < fac(4)
n = 4
n = 3
n = 2
n = 1n = 1 1! = 1
n = 2 2 · 1! = 2
n = 3 3 · 2! = 6
n = 4 4 · 3! = 24
fac(4)
fac(3)
2
526
![Page 165: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/165.jpg)
Der Aufrufstapel
Bei jedem Funktionsaufruf:Wert des Aufrufarguments kommt aufeinen StapelEs wird immer mit dem obersten WertgearbeitetAm Ende des Aufrufs wird der obersteWert wieder vom Stapel gelöscht
std:cout < < fac(4)
n = 4
n = 3
n = 2
n = 1n = 1 1! = 1
n = 2 2 · 1! = 2
n = 3 3 · 2! = 6
n = 4 4 · 3! = 24
fac(4)
fac(3) 6
526
![Page 166: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/166.jpg)
Der Aufrufstapel
Bei jedem Funktionsaufruf:Wert des Aufrufarguments kommt aufeinen StapelEs wird immer mit dem obersten WertgearbeitetAm Ende des Aufrufs wird der obersteWert wieder vom Stapel gelöscht
std:cout < < fac(4)
n = 4
n = 3
n = 2
n = 1n = 1 1! = 1
n = 2 2 · 1! = 2
n = 3 3 · 2! = 6
n = 4 4 · 3! = 24
fac(4)
6
526
![Page 167: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/167.jpg)
Der Aufrufstapel
Bei jedem Funktionsaufruf:Wert des Aufrufarguments kommt aufeinen StapelEs wird immer mit dem obersten WertgearbeitetAm Ende des Aufrufs wird der obersteWert wieder vom Stapel gelöscht
std:cout < < fac(4)
n = 4
n = 3
n = 2
n = 1n = 1 1! = 1
n = 2 2 · 1! = 2
n = 3 3 · 2! = 6
n = 4 4 · 3! = 24
fac(4) 24
526
![Page 168: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/168.jpg)
Der Aufrufstapel
Bei jedem Funktionsaufruf:Wert des Aufrufarguments kommt aufeinen StapelEs wird immer mit dem obersten WertgearbeitetAm Ende des Aufrufs wird der obersteWert wieder vom Stapel gelöscht
std:cout < < fac(4)
n = 4
n = 3
n = 2
n = 1n = 1 1! = 1
n = 2 2 · 1! = 2
n = 3 3 · 2! = 6
n = 4 4 · 3! = 24
24
526
![Page 169: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/169.jpg)
Euklidischer Algorithmus
findet den grössten gemeinsamen Teiler gcd(a, b) zweiernatürlicher Zahlen a und b
basiert auf folgender mathematischen Rekursion (Beweis imSkript):
gcd(a, b) =
{a, falls b = 0
gcd(b, a mod b), andernfalls
527
![Page 170: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/170.jpg)
Euklidischer Algorithmus
findet den grössten gemeinsamen Teiler gcd(a, b) zweiernatürlicher Zahlen a und b
basiert auf folgender mathematischen Rekursion (Beweis imSkript):
gcd(a, b) =
{a, falls b = 0
gcd(b, a mod b), andernfalls
527
![Page 171: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/171.jpg)
Euklidischer Algorithmus in C++
gcd(a, b) =
{a, falls b = 0
gcd(b, a mod b), andernfalls
unsigned int gcd(unsigned int a, unsigned int b)
{if (b == 0)
return a;else
return gcd (b, a % b);} 528
![Page 172: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/172.jpg)
Euklidischer Algorithmus in C++
gcd(a, b) =
{a, falls b = 0
gcd(b, a mod b), andernfalls
unsigned int gcd(unsigned int a, unsigned int b)
{if (b == 0)
return a;else
return gcd (b, a % b);}
Terminierung: a mod b < b, alsowird b in jedem rekursiven Aufrufkleiner.
528
![Page 173: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/173.jpg)
Fibonacci-Zahlen
Fn :=
0, falls n = 0
1, falls n = 1
Fn−1 + Fn−2, falls n > 1
529
![Page 174: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/174.jpg)
Fibonacci-Zahlen
Fn :=
0, falls n = 0
1, falls n = 1
Fn−1 + Fn−2, falls n > 1
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89 . . .
529
![Page 175: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/175.jpg)
Fibonacci-Zahlen in Zurich
530
![Page 176: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/176.jpg)
Fibonacci-Zahlen in C++
Fn :=
0, falls n = 0
1, falls n = 1
Fn−1 + Fn−2, falls n > 1
unsigned int fib (unsigned int n){
if (n == 0) return 0;if (n == 1) return 1;return fib (n-1) + fib (n-2); // n > 1
}531
![Page 177: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/177.jpg)
Fibonacci-Zahlen in C++
Fn :=
0, falls n = 0
1, falls n = 1
Fn−1 + Fn−2, falls n > 1
unsigned int fib (unsigned int n){
if (n == 0) return 0;if (n == 1) return 1;return fib (n-1) + fib (n-2); // n > 1
}
KorrektheitundTerminierungsind klar.
531
![Page 178: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/178.jpg)
Fibonacci-Zahlen in C++
Laufzeitfib(50) dauert „ewig”, denn es berechnetF48 2-mal, F47 3-mal, F46 5-mal, F45 8-mal, F44 13-mal,F43 21-mal ... F1 ca. 109 mal (!)
unsigned int fib (unsigned int n){
if (n == 0) return 0;if (n == 1) return 1;return fib (n-1) + fib (n-2); // n > 1
}
531
![Page 179: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/179.jpg)
Schnelle Fibonacci-Zahlen
Idee:
Berechne jede Fibonacci-Zahl nur einmal, in der ReihenfolgeF0, F1, F2, . . . , Fn!
Merke dir jeweils die zwei letzten berechneten Zahlen (Variablen aund b)!Berechne die nächste Zahl als Summe von a und b!
532
![Page 180: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/180.jpg)
Schnelle Fibonacci-Zahlen
Idee:
Berechne jede Fibonacci-Zahl nur einmal, in der ReihenfolgeF0, F1, F2, . . . , Fn!Merke dir jeweils die zwei letzten berechneten Zahlen (Variablen aund b)!
Berechne die nächste Zahl als Summe von a und b!
532
![Page 181: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/181.jpg)
Schnelle Fibonacci-Zahlen
Idee:
Berechne jede Fibonacci-Zahl nur einmal, in der ReihenfolgeF0, F1, F2, . . . , Fn!Merke dir jeweils die zwei letzten berechneten Zahlen (Variablen aund b)!Berechne die nächste Zahl als Summe von a und b!
532
![Page 182: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/182.jpg)
Schnelle Fibonacci-Zahlen in C++
unsigned int fib (unsigned int n){if (n == 0) return 0;if (n <= 2) return 1;unsigned int a = 1; // F_1unsigned int b = 1; // F_2for (unsigned int i = 3; i <= n; ++i){
unsigned int a_old = a; // F_i-2a = b; // F_i-1b += a_old; // F_i-1 += F_i-2 -> F_i
}return b;
}
(Fi−2, Fi−1) −→ (Fi−1, Fi)
a b533
![Page 183: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/183.jpg)
Schnelle Fibonacci-Zahlen in C++
unsigned int fib (unsigned int n){if (n == 0) return 0;if (n <= 2) return 1;unsigned int a = 1; // F_1unsigned int b = 1; // F_2for (unsigned int i = 3; i <= n; ++i){
unsigned int a_old = a; // F_i-2a = b; // F_i-1b += a_old; // F_i-1 += F_i-2 -> F_i
}return b;
}
(Fi−2, Fi−1) −→ (Fi−1, Fi)
a b533
![Page 184: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/184.jpg)
Schnelle Fibonacci-Zahlen in C++
unsigned int fib (unsigned int n){if (n == 0) return 0;if (n <= 2) return 1;unsigned int a = 1; // F_1unsigned int b = 1; // F_2for (unsigned int i = 3; i <= n; ++i){
unsigned int a_old = a; // F_i-2a = b; // F_i-1b += a_old; // F_i-1 += F_i-2 -> F_i
}return b;
}
(Fi−2, Fi−1) −→ (Fi−1, Fi)
a b533
![Page 185: 14. Zeiger, Algorithmen, Iteratoren und Container IIlec.inf.ethz.ch/itet/informatik1/2017/slides/lecture9.pdf · 14. Zeiger, Algorithmen, Iteratoren und Container II Iteration mit](https://reader033.fdocument.pub/reader033/viewer/2022051509/5ae851537f8b9acc268ff384/html5/thumbnails/185.jpg)
Schnelle Fibonacci-Zahlen in C++
unsigned int fib (unsigned int n){if (n == 0) return 0;if (n <= 2) return 1;unsigned int a = 1; // F_1unsigned int b = 1; // F_2for (unsigned int i = 3; i <= n; ++i){
unsigned int a_old = a; // F_i-2a = b; // F_i-1b += a_old; // F_i-1 += F_i-2 -> F_i
}return b;
}
(Fi−2, Fi−1) −→ (Fi−1, Fi)
a b
sehr schnell auch bei fib(50)
533