Höchsten Wert aus nichtprimitiven Vektor picken
-
Hi,
ich will aus einem Vektor gern den höchsten Wert picken. Jetzt besteht der Vektor aber aus Hilfsobjekten. Eine Eigenschaft des Hilfsobjekts ist ein float, nach diesem höchsten float will ich greifen - wie mache ich das - im Netz begegnen mir vor allem Beispiele mit std::max_element(), aber da liegen primitive Werte im Vektor [ http://www.cppreference.com/wiki/algorithm/max_element ] ?
Danke vorab.
-
std::max_element gibt es in zwei Varianten: Die erste verwendet operator<, um die Elemente zu vergleichen (den kannst du selber schreiben, wenn du diese Sortierung öfter benötigst), der zweiten gibst du eine Vergleichsfunktion mit:
bool stat_less(const helper& lhs, const helper& rhs) { return lhs.status() < rhs.status(); } //und im Einsatz: vector<helper>::iterator = max_element(liste.begin(),liste.ende(),stat_less);
-
Und mit C++0x geht auch das:
std::vector<FloatInside> MeinVec; float Max = std::numeretic_limits<float>::min(); for(FloatInside& Object: MeinVec) if(Object.InnerFloat() > Max) Max = Object.InnerFloat();Oder auch so:
std::vector<FloatInside> MeinVec; float Max = std::numeretic_limits<float>::min(); for_each(MeinVec.begin(), MeinVec.end(), [&Max](const FloatInside& Object){if(Object.InnerFloat() > Max)Max = Object.InnerFloat();});Oder wenn du den Iterator brauchst:
std::vector<FloatInside> MeinVec; std::vector<FloatInside>::iterator MeinIter; for(FloatInside& Object: MeinVec) { static float Max = std::numeretic_limits<float>::min(); if(Object.InnerFloat() > Max) MeinIter = &Object; }
-
EOutOfResources schrieb:
Und mit C++0x geht auch das:
Wenn schon jemand es geschafft hat, die <algorithm> zu finden und zu nutzen, empfehle ich ihm doch nicht eine selbstgebaute Schleife dafür (wobei - in C++0x könnte man die Vergleichsfunktion auch als Lambda-Expression zusammenbauen)
PS: Bist du dir sicher, daß die dritte Version einen Iterator zurückgibt? Bei vector<> ist zwar in den meisten Fällen der Iterator ein einfacher Pointer, aber erstens ist das nicht vorgeschrieben und zweitens kannst du den Code nicht für andere Containerklassen anwenden.
-
CStoll schrieb:
Wenn schon jemand es geschafft hat, die <algorithm> zu finden und zu nutzen, empfehle ich ihm doch nicht eine selbstgebaute Schleife dafür)
Stimmt, sorry.
CStoll schrieb:
wobei - in C++0x könnte man die Vergleichsfunktion auch als Lambda-Expression zusammenbauen
std::vector<FloatInside>::iterator = std::max_element(MeinVec.begin(),MeinVec.end(),[](const FloatInside& Left, const FloatInside& Right){return Left.InnerFloat() < Right.InnerFloat()});CStoll schrieb:
ist das nicht vorgeschrieben
*BuchHervorhol* Mist, hast recht. Ich dachte, dass der RandomAccessIter immer einen Konvertierungsoperator zu und von einem rohen Zeiger bietet.