integer-array sortieren!! Wie??



  • Hallo,

    ich habe ein Programm geschrieben, in dem ich u.A. einen integer-array sortieren muss!

    #include <iostream>
    #include <algorithm>
    
    using namespace std;
    
    int main()
    {
        int array[5];
    
        array[0]=16;
        array[1]=9;
        array[2]=13;
        array[3]=2;
        array[4]=5;
    
        for(int a=0;a<5;a++)
        {
            cout<<array[a]<<endl;
        }
    
        return 0;
    }
    

    Dieser Auszug ist extrem vereinfacht!!! array[a] sollte mit der Funktion sort() sortiert werden! Wie geht das??

    Ich habe an sowas gedacht:

    std::sort(array, array+5);
    cout<<array;
    

    Aber da kommt nur "Datenschrott" raus! Hat jemand eine Idee?

    MfG
    kira



  • kira schrieb:

    Ich habe an sowas gedacht:

    std::sort(array, array+5);
    cout<<array;
    

    Aber da kommt nur "Datenschrott" raus! Hat jemand eine Idee?

    dioe ausgabe geht so nicht.
    aber das sortieren mit std::sort(array, array+5); ist korrekt und gut.



  • #include <algorithm>
    #include <iostream>
    using namespace std;
    
    int main ()
    {
        int foo[7] = {3,6,1,9,4,2,0};
    
        sort (&foo[0], &foo[7]);
    
        for (int i = 0; i < 7; ++i)
            cout << foo[i] << endl;
    
    }
    

    Edit:
    Hab müll geschrieben



  • dioe ausgabe geht so nicht.

    Und wie muss ich es dann ausgeben lassen??

    kira



  • kira schrieb:

    dioe ausgabe geht so nicht.

    Und wie muss ich es dann ausgeben lassen??

    kira

    Du musst jedes element von array ausgeben lassen.
    Mit cout << array gibst du nur die Adresse des ersten Elementes aus.

    Devil



  • Hat SirLant doch schon gepostet, alternativ so:

    #include <algorithm>
    #include <iostream>
    #include <iterator>
    using namespace std;
    
    int main ()
    {
        int foo[7] = {3,6,1,9,4,2,0};
    
        sort (foo, foo+7);
        copy(foo, foo+7, ostream_iterator<int>(cout, " "));
    }
    

    MfG Jester



  • kira schrieb:

    dioe ausgabe geht so nicht.

    Und wie muss ich es dann ausgeben lassen??

    kira

    Das hast du doch schon in deinem ersten Beitrag richtig gemacht?!



  • Kennste die Makros: min und max? Das sind echt feine Dinger!



  • nix da schrieb:

    Kennste die Makros: min und max? Das sind echt feine Dinger!

    Worauf willst du hinaus?



  • SirLant schrieb:

    sort (&foo[0], &foo[7]);

    Bumm
    denn foo[7] gehört dir nicht



  • Shade Of Mine schrieb:

    SirLant schrieb:

    sort (&foo[0], &foo[7]);

    Bumm
    denn foo[7] gehört dir nicht

    und? macht es wirklich "Bumm"? ich glaube nicht.



  • Ich auch nicht, sonst würde end() auch BOOOM machen. Das wäre ein bisschen unintuitiv. 🤡



  • volkard schrieb:

    und? macht es wirklich "Bumm"? ich glaube nicht.

    OK, ersetzen wir BUMM durch Undefiniertes Verhalten. Ist das besser?

    Natürlich macht es nicht Bumm, weil der Compiler die Dereferenzierung wegoptimiert. Aber weshalb hier UB in kauf nehmen, auch wenn es auf 99% der Palttformen läuft, wenn man mit arr+7 das gleiche ohne UB und weniger Zeichen erreichen kann?

    Spätestens wenn arr eine Klasse wird, kann das arr[7] zu einem Bumm führen - denn dann könnte man ja Rangechecking (natürlich mit assert) einbauen, und das fliegt einem um die Ohren.

    @OPtimizer:
    *vec.end() ist IIRC auch verboten...

    Oder habe ich mich gerade blamiert?



  • *vec.end() ist natürlich verboten. Aber der sort geht ja nur bis 1 vor dem letzten, oder täusch ich mich da jetzt?



  • Optimizer schrieb:

    *vec.end() ist natürlich verboten. Aber der sort geht ja nur bis 1 vor dem letzten, oder täusch ich mich da jetzt?

    Wenn ich mich jetzt nicht total blödsinn quatsche:

    &foo[7]
    das ist die Adresse von foo[7]
    Und um die Adresse von foo[7] zu bekommen, braucht man erstmal foo[7]
    Aber foo[7] gibt es nicht. Deswegen denke ich, dass es UB ist.

    Der Code funktioniert aber trotzdem, weil der Compiler nicht dumm ist und aus &foo[7] einfach foo+7 macht - was er bei builtins ja kann. Aber bei einem vector müsste es IMHO nen Fehler geben, weil er eben kein 8. Element hat.



  • Stimmt, mit der Adresse ist das natürlich nochmal eine andere Situation. Hab ich nicht aufgepasst. 🙂
    Ich check grad sowieso nicht, warum hier überhaupt mit dem Adressoperator gearbeitet wird.



  • SirLant schrieb:

    nix da schrieb:

    Kennste die Makros: min und max? Das sind echt feine Dinger!

    Worauf willst du hinaus?

    Kleiner Tipp, da er ja sehr warscheinlich das Array nach Größeneinheiten sortieren will, sind diese Makros am besten dafür zu handhaben.

    Dafür muss man nicht fragen worauf ich hinaus will, das weiß man mit 5 sec. nachdenken.



  • Ich weiss es immer noch nicht. 🙄



  • Ich würde sagen es macht hier nicht BUMM, ganz einfach, weil das nen Iterator ist und
    der über ++ und -- inkrementiert und dekrementiert werden kann in diesem Fall ist &foo[7], ganz einfach 28Bytes hinter der Adresse von foo.
    Das gleiche macht man bei den Iteratoren von Klassen ja ebenfalls.

    Sort geht soweit bis der erste Parameter auf dem zweiten liegt, was ja passiert wenn
    zum 8.mal Inkrementiert wurde, dann wird auf eine Adresse gezeigt die uns nicht gehört, aber mit
    dieser wird ja nie gearbeitet.

    Edit:

    Um mal nen Beispiel zu bringen:

    #include <algorithm>
    #include <iostream>
    using namespace std;
    
    void waste_cpu_time (int *Anf, int *End)
    {
    	while (Anf != End)
    	{
    		*Anf = 12;
    		Anf++;
    	}
    }
    
    int main (void)
    {
    	int foo[] = {3,3,3,3};
    
    	copy(foo, foo+4, ostream_iterator<int>(cout, " "));
    
    	waste_cpu_time (&foo[0], &foo[4]);
    
    	copy(foo, foo+4, ostream_iterator<int>(cout, " "));
    
    }
    


  • Optimizer schrieb:

    Ich weiss es immer noch nicht. 🙄

    ich ebenso 🙄


Anmelden zum Antworten