transform aus <algorithm>



  • Hallo zusammen,

    ich beschäftige mich gerade mit der STL und bin auf den transform-Algorithmus gestoßen. Nachdem ich mir den entsprechenden Artikel in der C++-Referenz durchgelesen habe, sind leider noch ein paar Fragen offen geblieben, die euch euch jetzt gerne stellen möchte.

    Mittels des transform-Algorithmus quadriere ich alle Werte in einem Vector.

    #include <iostream>
    #include <vector>
    #include <algorithm>
    using namespace std;
    
    int square(int a) {return a*a;}
    
    int main() {
    
    	vector<float> vec;
    	for(int i=0; i<10; i++)
    		vec.push_back(i);	//Vector mit Zahlen füllen
    
     	transform (vec.begin(), vec.end(), vec.begin(), square);
    
    	for(int i=0; i<10; i++)
    		cout << vec[i] << " ";         
    	return 0;
    }
    

    1.) Verstehe ich das so richtig: Der erste Parameter ist ein Iterator auf den Anfang des Vektors, der zweite auf das Ende. Damit werden quasi die Grenzen einer Schleife geschaffen, die durch den Vektor iterieren. Der dritte Parameter gibt einen Iterator auf den Begin des Zielvektor dar. Der letzte ist schließlich ein Pointer auf die Funktion, die angewandt werden soll.

    2.) Handelt es sich hierbei um eine Implementierung der "map"-Funktion, die man aus funktionalen Programmiersprachen kennt?

    Vielen Dank
    LG, freakC++



  • zu 1): Richtig.
    Die funktionalen Programmiersprachen sind mir fremd...

    Edit: gibt es einen bestimmten Grund, warum sich die Datentypen der Funktion und des Vektors unterscheiden? Implizite Typumwandlungen sind manchmal nützlich, hier macht's aber keinen Sinn.



  • 1.- richtig
    2.- so wie du sie grad benutzt ja



  • Skym0sh0 schrieb:

    2.- so wie du sie grad benutzt ja

    Meinen bescheidenen funktionalen Kenntnissen ist die Antwort immer "ja". Beziehungsweise wenn du pingelig sein willst und darauf hinaus willst, dass vec hier verändert wird, dann wäre hier ein "nein" angebracht, weil Objekte in funktionalen Sprachen immutable sind. Aber prinzipiell ist std::transform nix anderes als map in funktionalen Sprachen.



  • Hallo :D.

    Vielen Dank für die rasche Antwort. Ich habe noch ein wenig herumgespielt. Dabei wollte ich mal versuchen, dass erst alle Zahlen ab dem dritten Element im Vektor quadriert werden. Dazu habe ich mal ganz naiv, an den ersten Parameter des transform-Algorithmus +3 gehängt. Zwar werden in der Tat nicht alle Zahlen quadriert, doch das Ergebnis sieht anders aus, also ich erwartet habe.

    Das ist das Ergebnis:

    9 16 25 36 49 64 81 7 8 9

    Kann mir das jemand erklären?

    Danke!



  • @michael e:
    aber meine .funktionalen programmierkenntnisse stecken noch in den kinderschuhen, kacke da grad im studium dran ab, weil das denken total strange und abstrakt ist (aber selbst schuld bei einem nicht-pflichtfach). genau wie prolog, auch total strange

    freakC++ schrieb:

    Dazu habe ich mal ganz naiv, an den ersten Parameter des transform-Algorithmus +3 gehängt.

    mach das gleiche mal mit dem ziel iterator 😉


Anmelden zum Antworten