Iterator an Methode übergeben



  • Moin zusammen,
    ich bräuchte mal kurz einen Denkanstoß 😃 😕

    /*
    
    #include <cstdlib>
    #include <iterator>     
    #include <list>        
    #include <set>
    #include <algorithm>   
    #include <iostream>
    
    using namespace std;
    
    class GleicheInteger {
    private:
       multiset<int> listenSet;
    public:
    
     GleicheInteger(multiset<int> _listenSet)
     : listenSet (_listenSet) {}
    
     bool operator()(const multiset<int>::iterator i) {
    
         bool doppelterWert = count (listenSet.begin(), listenSet.end(), *i); 
    
         return doppelterWert;   
     }
    
    };
    
    int main(int argc, char** argv) {
    
        list<int> listeEins {1,2,3,4,5,5,6,6};
        list<int> listeZwei {7,6,6,5,5,10,11};
    
        multiset<int> listenSet;
    
        copy( listeEins.begin(), listeEins.end(), inserter( listenSet, listenSet.end() ) );
        copy( listeZwei.begin(), listeZwei.end(), inserter( listenSet, listenSet.end() ) );
    
        set<int> doppelt;
    
        GleicheInteger obj(listenSet);
    
        int it = copy_if (listenSet.begin(), listenSet.end(), doppelt.begin(),
                  obj.operator () (&(it*)) );
    //    obj.operator () (it) );
    
    //    for (list<int>::iterator p = doppelt.begin(); p != doppelt.end(); ++p)
    //    cout << *p << endl;
    
        return 0;
    }
    

    Ich möchte in Zeile 52 den Iterator von copy_if an die Methode " bool operator()(const multiset<int>::iterator i) " übergeben. Wie geht das??

    Alle bisherigen Versuche schlugen leider fehl. Ich bin noch sehr unerfahren was Zeiger und Iteratoren angeht. 😞

    Vielen Dank schonmal

    p.s. ich weiß dass ich das .operator() auch anders schreiben kann 😃



  • Philipp2706 schrieb:

    Alle bisherigen Versuche schlugen leider fehl.

    Das heißt?



  • bool operator()(const multiset<int>::iterator &i) {
    
    obj.operator () (&(it*)) );
    

    ich habe irgendwo gelesen das man eine Referenz auf den Zeiger für den Iterator übergeben soll und die Funktion dann davon eine Referenz erhalten soll. Also so wie oben.
    Das geht leider nicht.
    Ich habe auch versucht den Iterator einfach als Kopie zu übergeben und ihn dann const zu setzen.
    Hat irgendwie alles nicht funktioniert. 😞



  • Hallo,
    schlag mich...
    aber ich vermute, aus Eigenversuchen mit den std::klassen,
    die nix mit dem operator zu tun haben,
    aber du brauchst den korrekten iterator der klasse welchen du an den operator übergeben willst.

    du brauchst den const_iterator.

    und ob Zeile 51-52 so funktioniert.... 😕



  • LowFly schrieb:

    aber du brauchst den korrekten iterator der klasse welchen du an den operator übergeben willst.

    Also der copy_if erzeugt einen "OutputIterator". die Methode in der Klasse braucht aber einen "multiset<int>::iterator".

    Ich weiß nicht ob eine konvertierung möglich ist oder ob man die Iteratoren überhaupt konvertieren kann/soll.

    LowFly schrieb:

    und ob Zeile 51-52 so funktioniert.... 😕

    Da liegt ja mein Problem. 😞
    Ich will den Iterator mittels Prädikat überprüfen. Und ich habe leider keine Ahnung wie ich das anstellen soll :p



  • und darauf wo's ankommt überliest du?

    du brauchst den const_iterator

    const multiset<int>::iterator &i
    
    multiset<int> multisetmap;
    
    const_iterator constmap_it multisetmap.cbegin();
    
    obj( constmap_it );
    

    constmap_it sollte keine schwierigkeiten machen wenn die dies so an den operator übergeben würdest.

    denn ob man so wie du es machst einen operator nutzen kann, weis ich jetzt gar nicht, ich habs zumindest noch nicht probiert.

    und mit Zeile 51-52 😕
    wollte ich andeuten, und ich bin mir jetzt echt nicht sicher, ich versuch es mal in Worte zu fassen, aber du deklariert eine variable (int it) welche durch die Funktion copy_if belegt wird. Diese Variable it übergibst du als Verweis an den Operator der zuvor erstellten klasse, welche du an die Funktion copy_if als Parameter übergibst.

    Und jetzt kommt der punkt der mich 😕 macht, denn da beist sich die katze in den schwanz. Die Parameter braucht doch die Funktion um dir den Rückgabewert zu erstellen. 🙄



  • Vielen Dank erstmal für deine Antwort.

    LowFly schrieb:

    und darauf wo's ankommt überliest du?

    Zitat:
    du brauchst den const_iterator

    C++:
    const multiset<int>::iterator &i

    C++:
    multiset<int> multisetmap;

    const_iterator constmap_it multisetmap.cbegin();

    obj( constmap_it );

    oh ja.
    Ich hab es jetzt so gelöst, bekomme jedoch jetzt eine andere Fehlermeldung.

    multiset<int>::const_iterator constmap_it = copy_if (listenSet.begin(), listenSet.end(), doppelt.begin(),
                  obj(constmap_it) );
    

    LowFly schrieb:

    und mit Zeile 51-52 😕
    wollte ich andeuten, und ich bin mir jetzt echt nicht sicher, ich versuch es mal in Worte zu fassen, aber du deklariert eine variable (int it) welche durch die Funktion copy_if belegt wird. Diese Variable it übergibst du als Verweis an den Operator der zuvor erstellten klasse, welche du an die Funktion copy_if als Parameter übergibst.

    Und jetzt kommt der punkt der mich 😕 macht, denn da beist sich die katze in den schwanz. Die Parameter braucht doch die Funktion um dir den Rückgabewert zu erstellen. 🙄

    Ich beschreibe erstmal wie ich es mir vorgestellt habe^^

    Die Klasse GleicheInteger soll als Prädikat dienen.
    Es soll für jeden int-Wert aus der set (also da wo der Iterator in dem Moment steht) überprüft werden, ob es diesen Wert doppelt gibt.
    Wenn ja soll dieser Wert in eine neue Liste ("set<int> doppelt") kopiert werden.

    Ich habe es mir so gedacht, dass man den aktuellen Iterator an das Prädikat(also klasse/Objekt) weitergeben kann.

    In der Methode "bool operator()" wird dann halt kontrolliert ob es einen doppelten Wert gibt, und wenn ja, ein bool-Wert zurückgegeben.

    Dieser true-Wert sorgt dann im copy_if dafür dass der jeweilige Wert in die andere Liste ("set<int> doppelt") kopiert wird.

    Ich verstehe glaube ich auch was du meinst, aber ich weiß halt nicht wie ich den aktuellen Iterator übergeben kann.
    Eventuell mit einem Zeiger auf den Iterator?



  • Soo,
    das Problem lag darin, dass die Methode/Prädikat ein Integer erwartet und anscheinend garkeine Iteratoren verarbeiten kann.
    Außerdem habe ich die Set zu einer Liste abgeändert, weil bei einem Set das random access nicht funktioniert.

    Ich arbeite aber noch an der Lösung 🕶



  • Philipp2706 schrieb:

    Außerdem habe ich die Set zu einer Liste abgeändert, weil bei einem Set das random access nicht funktioniert.

    Bei std::list geht das genau so wenig.
    Meinst du mit Liste vielleich std::vector ?


Log in to reply