Vektorfrage
-
Ich will in einem Vektor die Position des kleinsten positiven Wertes ermitteln.
Damit:iter = min_element(vec.begin(), vec.end()); size_t pos = distance(vec.begin(), iter);
finde ich den kleinsten Wert insgesamt, aber ich suche den kleinsten positiven Wert. Kann man das irgendwie genial-kurz abändern?
-
kann man doch eigentlich prüfen, ob die zahl positiv ist... wenn ja dann speichere sie, ansonsten mache weiter... oder?
-
Ich wills nicht mit ner Schleife machen oder so (die Lösung hab ich schon), sondern supikurz mit STL-Mitteln. Dachte, man könnte obigen Code noch irgendwie kurz erweitern.
Ich darf den zu durchsuchenden Vektor auch nicht in seiner Größe ändern (z. B. alle neg. Werte rauswerfen), da ich die Position brauche und die würde dann nicht mehr stimmen.
-
find/find if/for_each usw können das, musst halt nur den richtigen functor schreiben
-
Wie otze schon gesagt hat, schreibe dir den Funktor.
Das kann z.B. so aussehen:#include <vector> #include <algorithm> #include <iostream> struct functor { template <class T> bool operator()(T first, T last) { return first < last && first >= 0; } }; int main() { std::vector<int> vec; vec.push_back(5); vec.push_back(4); vec.push_back(3); vec.push_back(1); vec.push_back(-10); std::vector<int>::iterator iter = min_element(vec.begin(), vec.end(), functor()); size_t pos = distance(vec.begin(), iter); std::cout << pos << " " << *iter; }
-
Danke.
-
Wieso eigentlich immer so compliziert? Ne Funktion ist ja auch ein Fuktor:
#include <vector> #include <algorithm> #include <iostream> template <class T> bool foo()(T first, T last) { if(first < last && first >= 0) return true; return false; } int main() { std::vector<int> vec; vec.push_back(5); vec.push_back(4); vec.push_back(3); vec.push_back(1); vec.push_back(-10); std::vector<int>::iterator iter = min_element(vec.begin(), vec.end(), foo); size_t pos = distance(vec.begin(), iter); std::cout << pos << " " << *iter; }
-
Irgendwer schrieb:
template <class T> bool foo()(T first, T last) { if(first < last && first >= 0) return true; return false; }
Wozu die if-Anweisung?
return first < last && first >= 0;
-
HumeSikkins schrieb:
Irgendwer schrieb:
template <class T> bool foo()(T first, T last) { if(first < last && first >= 0) return true; return false; }
Wozu die if-Anweisung?
return first < last && first >= 0;Musst du ChrissiB fragen, ich hab nur den Code copy & pasted. Daher hab ich auch vergessen die überflüssigen () hinter foo wegzumachen.
-
Ich habe daran nicht mehr gedacht, ich werde es mal gleich editieren.