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