stl algorithmus find()



  • Hallo Leute,
    hat jemand einen Plan wie man find() auf eine std::list <std::pair<int,int> > anwendet folgender code generiert einen error c2039.

    std::list< std::pair<int,int> > flist;
    std::list< std::pair<int,int> >::iterator fIt;
    
    for(int k=0; k<maxK; k++)
    {
         fIt= std::find(flist.begin(), flist.end(), k);
    
         if(fIt!=flist.end())
              // gefunden -> k == fIt->first
         else
             // nicht gefunden
    }
    

    Die Liste soll also auf das erste auftreten von k untersucht werden.

    Falls jemand eine Lösung hat würd ich mich freuen die zu lesen.



  • Hallo,

    warum suchst du nach einem einzelnen int in einem Container, der std::pair<int, int> enthält? Such nach dem richtigen Datentyp.

    MfG

    GPC



  • Ok. der falsche Datentyp. Ich möchte prüfen ob eines der pair::first elemente in der Liste mit k übereinstimmt. Ohne eine for Schleife zu verwenden.

    cu.



  • EDIT: Bullshit-Code removed...

    Mich beschleicht trotzdem das Gefühl, du hast die falsche Datenstruktur (list mit pair als Elementen) ausgewählt. Wäre es ein Problem, eine std::map zu verwenden, die hat Schlüssel-Wert Paare als Elemente, ist immer sortiert und flott beim Suchen.

    MfG

    GPC



  • Ich denke da musst du schon nen eigenes pair erstellen und den op== so definieren das er nur first vergleicht.

    Was anderes fällt mir nicht ein 😉

    template<typename T1,typename T2>
    class mypair {
    
       private:
               pair<T1,T2> pp;
       public:
               mypair(T1 a, T2 b) : pp(a,b)  {};
               ~mypair() {}; 
    
               bool operator== (const T1& rob) { return pp.first == rob; }                  
    
    };
    

    Dann ganz normal mit find arbeiten...



  • GPC schrieb:

    std::list< std::pair<int,int> > flist;
    std::list< std::pair<int,int> >::iterator fIt;
    
    std::pair<int, int> p;
    p.first = p.second = -1;  //Ich gehe mal davon aus, dass -1 nicht bei second vorkommt, ersetze es halt durch eine angemessen Zahl
    for(int k=0; k<maxK; k++) {
         p.first = k;
         fIt= std::find(flist.begin(), flist.end(), p);
    
         if( fIt != flist.end() )
              // gefunden
         else
             // nicht gefunden
    }
    

    Verstehe ich irgendwie nicht 🙄
    Das kann doch nicht funktionieren, weil das komplette pair in find() verglichen wird.
    Aber es soll doch nur mit first verglichen werden ...

    Ansonsten wie GPC sagte, wieso kein std::map ?



  • Ah, fuck. Stimmt. 😞
    Na dann entweder eigenen Comparator oder std::map
    Eigene Klasse bauen halte ich für unvorteilhaft, ne simple Funktion reicht aus und irritiert nicht unnötig mit dem unvertrauten Verhalten von op==



  • Danke für die manigfaltigen Abtworten.
    Also manchmal bin auch dumm wie Brot und verzettel mich. Eine std::map ist genau der assoziative Container der die Aufgabe mit bravour löst.

    Der Code sieht jetzt so aus.

    std::map< int, int, std::greater<int> > fmap;
    std::map< int, int, std::greater<int> >::iterator fIt;
    
    for(int k=0; k<maxK; k++)
    {
         fIt= fmap.find(k);
    
         if(fIt!=flist.end())
              // gefunden mache blabla
         else
             // nicht gefunden mache bimbom
    }
    

    Echt doof von mir auf der pair Liste zu beharren. Tausend dank an all die netten Leute die mir geholfen haben.

    THX && CU


Anmelden zum Antworten