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


Anmelden zum Antworten