Frage zu bind1st-Funktion



  • Hallo,
    ich versuch das Konzept von bind1st zu verstehen. Soweit ich verstanden habe, wird durch das bind1st das erste Parameter fest und der zweiter Parameter variable.
    Kann mir jemand sagen, was ich in dem Code falsch gemacht habe?
    mul ist eine Multiplikationsfunktion und das erste Argmument wird mit bind1st mit 3 gebunden. Jetzt wird eine Liste durchlaufen und alle Element werde mit 3 multipliziert und in ein andere Liste gespeichert.
    Das kommt als Fehlermeldung error: too few arguments to function 'int mul(const int&, const int&)

    #include <iostream>
    #include <list>
    #include <algorithm>
    #include <functional>
    
    using namespace std;
    
    template <class T> void print(T start, T end) {
        for ( ;start != end; ++start) {
            std::cout << *start << " "; 
        }
    }
    
    int mul(const int& a, const int& b)
    {
        cout <<"a:"<<a<<endl;
        cout <<"b:"<<b<<endl;
        return(a*b);
    }
    
    int main()
    {
        int t1[]={1, 2, 3};
        list <int> l1(t1, t1+3);
        list <int> l2(l1.size());
        
        cout<<"Source collection:\n";
        cout<<"l1: "; print(l1.begin(), l1.end()); cout<<endl;
    
        transform(l1.begin(), l1.end(), l2.begin(),  bind1st(mul(), 3) );
        cout<<"Ergebnis" << endl; 
        cout<<"l2: "; print(l2.begin(), l2.end()); cout<<endl;
        return 0;
    }
    


    1. bind1st usw. sind nicht mehr in C++ vorhanden (seit C++17, siehe https://en.cppreference.com/w/cpp/utility/functional/bind12), seit 2011 nimmt man stattdessen ein Lambda! (oder https://en.cppreference.com/w/cpp/utility/functional/bind)

    2. Du müsstest die Funktion selbst binden, nicht das Ergebnis von mul mit 0 Argumenten. (also keine Klammern für den Aufruf)

    3. Warum zur Hölle std::list? Nimm vector, wenn du keinen speziellen Grund für etwas anderes hast.



  • OK. Danke!
    Ist nicht mein Code. Code Snippet ist von einer Schulung und wird nirgendwo produktiv vewendet. Mir egal, ob da list, vector oder fbghfdgjfdh steht. Hauptsache ich verstehe einigermaßen, was es mit bind1st auf sich hat.
    Schön, dass ich mit veraltetem Schulungsmaterial arbeiten darf...



  • AFAIK ist bind1st so ausgelegt, dass es als Funktionsargument etwas von std::binary_function abgeleitetes erwartet. Für Funktionen muss man den Adapter ptr_fun verwenden. Die Funktion selber muss dann auch noch eine passende Signatur haben.

    Es müsste als wie folgt lauten:

    int mul(int a, int b)
    ...
    transform(l1.begin(), l1.end(), l2.begin(),  bind1st(ptr_fun(&mul), 3) );
    ...
    

    Dafür ist das Ganze aber auch C++98.

    @asd1 sagte in Frage zu bind1st-Funktion:

    Schön, dass ich mit veraltetem Schulungsmaterial arbeiten darf...

    Wo kommt das her?



  • @manni66
    C++ Institute



  • @asd1 The project was launched in 2011. The first work on the C/C++ e-learning system started in 2009, while the idea came much earlier

    Seitdem hat sich dann wohl nicht viel weiterentwickelt.


Log in to reply