Minimum gesucht
-
Ich suche in einem int-Vektor die Position des kleinsten Elements. Habe das mit Schleifen und herkömmlichen algorithmischen Mitteln gelöst, gibt es aber in der STL dafür was geniales?
-
std::min_element
-
Mit min_element erhalte ich das kleinste Element, ich brauche aber die "Position" dieses Elementes.
Bei {1,2,3,4,5,6,-2,3,2} will ich 7 (oder 6 wenn Start bei 0) haben.
Oder übersehe ich was.
-
std::min_element arbeitet wie jeder Algorithmus der Standardbibliothek mit iteratoren:
int a[] = {1,2,3,4}; int* pos = std::min_element(a,a + sizeof(a));
Hier wird also die Position des kleinsten Elements zurückgegeben.
-
Du bekommst einen iterator von min_element(). Dieser iterator 'zeigt' auf das niedrigste Element. Um jetzt die Position zu ermitteln, kann man ein einfaches
iter=min_element(vec.begin(), vec.end()); size_t pos=distance(vec.begin(), iter);
Und schon hast du in pos die richtige Position stehen
-
Iteratoren, natürlich
Danke.
Noch eine letzte Frage dazu: Wie würde man hier das Minimum der zweiten Zeile ermitteln?
a[3][3] = {1,2,3, 4,5,6, 0,4,3}
-
int* begin = a[1]; int* end = begin + sizeof(a[1]); min_element(begin,end);
-
Danke. Kannst du mir auch verraten, wie es geht, wenn man einen 2-D-Vektor hat?
-
Das geht nicht. Da müsste man den Inhalt in einen eindimensionalen Array kopieren.
-
Erst neuen 1-D-Vektor erstellen, dann umkopieren ...
Na gut, dann also ohne STL und auf herkömmliche Weise mit Schleifen etc.
Hast mir geholfen, danke.
-
Hi!
So ginge es, musst allerdings immer erst die Werte in einem 1D-Vektor speichern und diesen dann im 2D-Vektor speichern, dann den 1D Leeren, wieder befüllen und wieder wegspeichern usw.:
vector<vector<int> > dim2; vector<int> dim1; dim1.push_back(10); dim1.push_back(20); dim1.push_back(30); dim2.push_back(dim1); dim1.clear(); dim1.push_back(15); dim1.push_back(25); dim1.push_back(35); dim2.push_back(dim1); dim1.clear(); dim1.push_back(5); dim1.push_back(4); dim1.push_back(3); dim2.push_back(dim1); size_t sz = dim2.size(); int x=0; for(size_t i=0; i<sz; ++i) { vector<int>::iterator toll = min_element(dim2[i].begin(), dim2[i].end()); if(i==0) x=*toll; if(x>*toll) x=*toll; } cout << x;
Code-Hacker