Probleme mit for_each



  • Eigentlich ist ja for_each (wie der Name sagt) für jedes Element (von deq1.begin bis deq1.end) gedacht. Das machst du aber nicht, und somit missbrauchst du for_each.



  • Bulli schrieb:

    Eigentlich ist ja for_each (wie der Name sagt) für jedes Element (von deq1.begin bis deq1.end) gedacht. Das machst du aber nicht, und somit missbrauchst du for_each.

    Also nochmal. Das mit dem tauschen der Werte war nur ein Beispiel. Dass das nicht viel Sinn ergibt ist mir schon klar.
    Ich wollte einfach nur wissen, ob sowas möglich ist.

    #include <iostream>
    #include <vector>
    #include <algorithm>
    
    void add ( std::vector<int> &val ){
    	val++;
    }
    
    int main(){
    	std::vector<int> Irgendwas;
    
    	Irgendwas.push_back ( 1 );
    	Irgendwas.push_back ( 4 );
    	Irgendwas.push_back ( 8 );
    	Irgendwas.push_back ( 2 );
    
    	int Add = 2;
    
    	std::for_each ( Irgendwas.begin(), Irgendwas.end(), add ( Add ) ); // <-- Hier bei for_each der Funktion "add" einen Parameter zu übergeben
    
    }
    


  • Deine Funktion passt nicht, zusätzliche Parameter hin oder her. Der Parameter darf kein vector sein, sondern nur int.

    Was willst du mit dem Code denn erreichen?



  • Im Prinzip kann man Funktoren als "Funktionen mit Status" ansehen, in der Praxis sind sie einfach ein Objekt, auf dem man "operator()" aufrufen kann. Näheres hier 🙂



  • Äh sorry, eigentlich wollte ich nur das hier schreiben

    std::for_each ( Irgendwas.begin(), Irgendwas.end(), add ( Add ) ); // <-- Hier bei for_each der Funktion "add" einen Parameter zu übergeben
    

    Der Rest des Programms gehört nicht dazu.
    Ich will damit gar nichts erreichen. Ich habe bis jetzt nur gesehen, dass bei for_each kein Parameter übergeben wird. Und deshalb habe ich mich gefragt ob es möglich ist einen zu übergeben. War reines Interesse ob es möglich ist oder nicht.



  • möchtest Du sowas?

    void add ( int & val ){
      val += 2;
    }
    
    int main(){
    ...
    	std::for_each ( Irgendwas.begin(), Irgendwas.end(), add ); 
    ...
    }
    

    soweit ich weiß, kannst Du keinen Parameter übergeben.
    Allerdings könnte man tricksen mit

    template <int i>
    void add ( int & val ){
      val += i;
    }
    
    int main(){
    ...
    	std::for_each ( Irgendwas.begin(), Irgendwas.end(), add<2> );
    }
    

    geht aber natürlich nur mit "passenden Typen".

    Oder Du nimmst ein Funktor, den Du initialisierst:

    struct add {
       int const i;
       add(int i) : i(i) {}
       add(add const&  a) : i(a.i) {}
       void operator()(int& v) { v += i; }
    };
    
    int main(){
    ...
       add a(5);
       std::for_each ( Irgendwas.begin(), Irgendwas.end(), a );
    }
    

    Da kannst Du dann auch beliebige Typen reinpacken.
    Allerdings habe ich hier mal gelesen, dass der Funktor zwischen den Aufrufen keinen "Status halten" darf - der Compiler macht das zwar üblicherweise mit, aber es kann zu unerwarteten ergebnissen kommen...

    Gruß,

    Simon2.

    P.S.: Ich freu mich schon auf Lambda-Funktionen... 😃



  • int const i;
    

    Unschön. Du verbietest damit den op=



  • Shade Of Mine schrieb:

    int const i;
    

    Unschön. Du verbietest damit den op=

    Stimmt.
    Also dann ohne const .... (wenigstens private)

    Gruß,

    Simon2.



  • 123 schrieb:

    Bulli schrieb:

    Eigentlich ist ja for_each (wie der Name sagt) für jedes Element (von deq1.begin bis deq1.end) gedacht. Das machst du aber nicht, und somit missbrauchst du for_each.

    Also nochmal. Das mit dem tauschen der Werte war nur ein Beispiel. Dass das nicht viel Sinn ergibt ist mir schon klar.

    Du hast mein Post leider nicht verstanden! Das was du willst, geht nicht mit for_each!

    #include <iostream>
    #include <vector>
    #include <algorithm>
    
    void add ( int i ){
       // was du mit i machen willst... kommt hier rein!
    }
    
    int main(){
    	std::vector<int> Irgendwas;
    
    	Irgendwas.push_back ( 1 );
    	Irgendwas.push_back ( 4 );
    	Irgendwas.push_back ( 8 );
    	Irgendwas.push_back ( 2 );
    
            // Das geht nur so:
    	std::for_each ( Irgendwas.begin(), Irgendwas.end(), add);
    
    }
    

    Was macht for_each zur Laufzeit? Sowas:

    add(1);
    add(4);
    add(8);
    add(2);
    

    Mehr macht for_each nicht. Es ruft jedes add mit den Wert aus Irgendwas auf. halt for_each.



  • Bulli schrieb:

    Du hast mein Post leider nicht verstanden! Das was du willst, geht nicht mit for_each!

    Stimmt, hab dich wirklich erst mal falsch verstanden.
    Trotzdem danke nochmal für die ganzen Antworten.




Anmelden zum Antworten