Menu Close

Programmieren, Algorithmen und Datenstrukturen 2 (Vorlesung 13)

Klassenbibliotheken

  • Vorgefertigte Container mit vielseitigen Funktionen
  • Größtenteils standardisiert

STL

  • Containerkonzept
  • Begin() und End() sind die wichtigsten Interatoren einer Elementsequenz
  • Ein Iterator ist ein Typ der mindestens die Operationen „++“, „*“ und „==“ beherrscht

Vector

  • lückenloses und gekapseltes Datenfeld
  • Zeiger zeigt auf das erste Element
  • Beim Einfügen / Insert von Elementen werden alle Folgenden verschoben
  • Wenn das letzte Element eingefügt wird muss nichts verschoben werden
  • Alle Zeiger sind nach einem Insert / Delete unbrauchbar → neu bestimmen

Liste

  • Funktionsweise nach außen hin wie bei Vector
  • Aufbau „unter der Haube“ jedoch ganz anders
  • leere List enthält mindestens das leere Element

Iterator

  • Verbesserte Funktion der Zeiger

Accumulate

  • Enthalten in <numeric>
  • Verschieben des Zeigers auf das 1. Element um 1
  • Addition der Summe + „1. Element“
  • Überladen mit 4 Parametern
template
T accumulate( IterIn first, IterIn last, T init ){
while( first!=last ) {
init = init + *first;
++first;
}
return init;
}

//Anwendungsbeispiel
void f( vector& vd, int* p, int n )
{
	// addiere die Elemente von vd:
	// der Typ des 3. Arguments bestimmt auch die Rechengenauigkeit
	double sum = accumulate( vd.begin(), vd.end(), 0.0 );

	// addiere die int Werte in ein int (Überlauf gut möglich):
	// p+n kann man sich grob als &p[n] vorstellen
	int si = accumulate( p, p+n, 0 );

	// addiere die int Werte in ein long:
	long sl = accumulate( p, p+n, long(0) );

	// addiere die int Werte in ein double:
	double s2 = accumulate( p, p+n, 0.0 );

	// die Variable für den Rückgabewert kann im Initialisierer verwendet werden
	double s3 = 0;
	s3 = accumulate( vd.begin(), vd.end(), s3 );
}

int main()
{
	int sum = accumulate( v.begin(), v.end(), 0 );
	// sum wird 10
	// StdLib Header für accumulate(): numeric
}
template
T accumulate( IterIn first, IterIn last, T init, BinOp op )
{
	while( first!=last )
		{
			init = op( init, *first );
			// d.h. "init op *first"
			++first;
		}
	return init;
}

//Anwendungsbeispiel für Multiplikation
#include
void f( list& ld ) {
	double product = accumulate( ld.begin(), ld.end(), 1.0,
	multiplies() );
}

Funktoren

  • Objekt, dass sich wie eine Funktion verhält und einen Rückgabetyp hat
  • Erzeugung mittels Überladung der Operatorfunktion „()“

Klausur

  • Funktoren könnten dran kommen

Multiplies

  • bei nicht standardisierten Datentypen muss dieser Funktor überladen werden

Matrizen

  • Objekt im 3. Raum → Tensor

Der map-Container

  • Beinhaltet eine geordnete Sequenz von Schlüssel- Wert-Paaren, in der man anhand des Schlüssels nach dem zugehörigen Wert suchen kann
int main() {
  map<string,int> words; // Worte und ihre Häufigkeit
  string s;
  while( cin>>s && s!="quit" )
    ++words[s]; // der Schlüssel von words ist vom Typ string
                // die int Werte von words werden mit 0 initialisiert
                // wenn s schon enthalten ist, erhöht map dessen Wert mit ++ um 1
                // wenn s noch nicht enthalten ist, wird ein (s,0)-Paar
                // eingefügt und mit ++ auf den Wert 1 erhöht
                // words[s] liefert int& als Anzahl des Worts s
  typedef map<string,int>::const_iterator Iter;
  for( Iter p = words.begin(); p != words.end(); ++p )
    cout << p->first << ':' << p->second << '\n';
  return 0;
}

Ende: Seite 42

Schreiben Sie einen Kommentar

Ihre E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahren Sie, wie Ihre Kommentardaten verarbeitet werden.

Index