Function Objects

Ein neues Element sind die function objects, sie sind wichtig für die generischen STL-Algorithmen.

Z.B. der sort Algorithmus: Beim Aufruf mit 2 Argumenten (Anfang und Ende des Container-Bereichs) wird implizit der \bgroup\color{green}\ensuremath{ <}\egroup Operator für die jeweilige Klasse benutzt, d.h. Sortieren in aufsteigender Reihenfolge.

Das umgekehrte, d.h. sortieren in absteigender Reihenfolge kann man erreichen mit:
vector<string> vecstr(...); ... ;
sort(vecstr.begin(), vecstr.end(), greater<std::string>());

greater<std::string>() ist ein Konstruktor:
Es wird ein Objekt der greater<>() template Klasse für string angelegt.

In dieser Klassse ist der () Operator definiert, ungefähr so:

bool operator () (const string & s1; const string & s2 ) {
    return( s1 > s2 ); }


Solche Function Objects kann man auch selbst definieren, hier ein Beispiel für die Dreier-Vektoren:



#include "myvec.hxx"
class Comp3VecX { // "<" Vergleich fuer DreierVektor x-Komponente
public:
  bool operator () (const My3Vector & v1, const My3Vector & v2) {
    return( v1.X() < v2.X() );
  }
};

int main () {
  vector<My3Vector> vvec; // empty <My3Vector> vector
  //.. fill it
  sort(vvec.begin(), vvec.end()); // sortieren mit "<" Operator
  // sortieren mit function object, nur x-Komponente
  sort(vvec.begin(), vvec.end(), Comp3VecX()); 
}


Comp3VecX ist eine Art Hilfs-Klasse für My3Vector, einziges Member ist der () Operator.


GDuckeck 2019-08-01