Array mit sort sortieren



  • #include <algorithm>
    int a[] = {2,7,3,5,6};
    std::sort(&a[0], &a[5]);
    

    Dieses a[5] sieht ziemlich undefiniert aus. a[4] als rechte Grenze geht nicht, sonst wird das letzte Element nicht mit sortiert.
    Wie löst man das elegant? std::vector wäre deutlich umständlich, std::array kennt mein Kompiler nicht, ein Dummyelement ans Ende tun scheint auch nicht so optimal.



  • Naja, einfach

    std::sort( a, a+5 );
    


  • a+5 ist nicht UB? o.o


  • Mod

    nwp3 schrieb:

    a+5 ist nicht UB? o.o

    Ein Zeiger, der eins hinter das letzte Element eines Arrays zeigt, konnte schon immer gebildet werden.
    Die Frage, ob auch eine Dereferenzierung zulässig ist/sein sollte, ist deshalb öfter diskutiert worden, z.B. hier, wobei ich nicht erkennen kann, dass eine definitive Antwort gegeben worden wäre.
    In C11 ist diese Frage geklärt, dort ist die DerefenzierungIndirektion gefolgt von dem Adress-Operator eine Nulloperation, und damit auch für Zeiger, die hinter das letzte Element eines Arrays zeigen, und auch für Nullzeiger wohldefiniert.


  • Mod

    nwp3 schrieb:

    a+5 ist nicht UB? o.o

    Nein, bloß falsch. Es müsste hier a+6 heißen. Oder besser noch eine flexible Lösung, die sich an der Größe des Arrays orientiert (z.B. klassisch mit sizeof oder modern mit begin/end), damit solche Fehler gar nicht erst passieren.



  • nwp3 schrieb:

    a+5 ist nicht UB? o.o

    Nein, das ist ok. Und da a[n] == *(a+n) ist, geht deine Variante genau so.



  • SeppJ schrieb:

    nwp3 schrieb:

    a+5 ist nicht UB? o.o

    Nein, bloß falsch. Es müsste hier a+6 heißen.

    Hmm 😕


  • Mod

    out schrieb:

    SeppJ schrieb:

    nwp3 schrieb:

    a+5 ist nicht UB? o.o

    Nein, bloß falsch. Es müsste hier a+6 heißen.

    Hmm 😕

    Ach, ich kann selber nicht bis 5 zählen (wer lässt auch ein Feld mit 5 Einträgen auf eine 6 enden? Das ist nicht leserfreundlich! 🙂 ). Eben wegen solcher Fälle zählt man nicht von Hand. Viel zu viel Fehlerpotential.



  • ...



  • Swordfish schrieb:

    Schöner Idiomatischer geht's doch fast schon nimmer. 😉

    - Ich hasse es, wenn in meinen Dateien \b\b drin steht.
    - Bei "6}" fehlt ein Leerzeichen.
    - Idiomatisch ist using std::begin; using std::end; , damit bei begin(...) ADL stattfinden kann.

    • decltype( *a ) failt schon bei einem Vektor -- hier wäre std::decay< decltype( *begin( a ) ) >::type angebracht.

    Hyperidiomatische Anmerkungen:
    - 6 mal std::sentry konstruieren und die ctype-Facette holen ist unnötig, die Zahlen können auch von Hand mit der num_put gepusht werden.
    - sync_with_stdio(false) für noch mehr Speed
    - ...


Log in to reply