Anfängerfrage: Vertauschen von Arrayinhalten



  • Hallo

    Ich habe:

    int Feld[20]

    in Feld[0] steht zum Beispiele ein 5
    und in Feld[10] steht eine 12

    Jetzt möchte ich gerne die 5 von Feld[0] in Feld[10] schreiben und die 12 von Feld[10] in Feld[0]

    Ich mache das im moment über eine hilfsvariable.

    Gibt es dafür zufällig einen Befehl sowas wie change(Feld[0],Feld[10]) oder ähnliches?

    Danke für eure Hilfe

    sub





  • Hallo

    Oder auch std::swap, eine standard-konforme Kapselung des Dreieckstausches.

    bis bald
    akari



  • Undertaker schrieb:

    http://en.wikipedia.org/wiki/XOR_swap_algorithm
    🙂

    wenn man assembler auf c(++) anwendet, lol



  • rapso schrieb:

    Undertaker schrieb:

    http://en.wikipedia.org/wiki/XOR_swap_algorithm
    🙂

    wenn man assembler auf c(++) anwendet, lol

    ja, hihi, ich weiss - mit einer temporären variable ist man meistens besser dran.
    aber XOR sieht doch schick aus 😉 und ausserdem sind C und assembler ja nicht sooo weit voneinander entfernt.
    🙂



  • ja danke schön!



  • Undertaker schrieb:

    und ausserdem sind C und assembler ja nicht sooo weit voneinander entfernt.
    🙂

    Wir sind hier aber nicht in C, sondern in C++ (nur falls du es übersehen hast). Und der XOR-Swap mag ja für primitive Daten (und platzkritische Aufgaben) wie int's die "ideale" Lösung sein, ein Versuch, den auf vollwertige Objekte umzusetzen, wäre aber tödlich für ein Programm.



  • CStoll schrieb:

    ...ein Versuch, den auf vollwertige Objekte umzusetzen, wäre aber tödlich für ein Programm.

    erklärung bitte...
    🙂



  • In Kurzfassung: Jeder Versuch, vollwertige Objekte auf Binär-Ebene zu manipulieren, ist potentiell tödlich, weil du dabei bestimmte Invarianten verletzt, auf deren Einhaltung die Klassenmethoden vertrauen.
    (z.B. verwende ich in einer Kontrollklasse einen vector von Objekten, die wiederum jeder einen Zeiger auf ihren Controller haben - bei einem XOR-Swap würde ich nur die Binärrepresentation der internen vector-Daten austauschen, aber die vector-Elemente arbeiten plötzlich mit dem falschen Controller zusammen - der klassische Dreieckstausch nutzt meinen op= und passt darum auch die unterliegenden Objekte an)



  • CStoll schrieb:

    - der klassische Dreieckstausch nutzt meinen op= und passt darum auch die unterliegenden Objekte an)

    d.h. du brauchst einen ganz speziellen op=, der eventuell auch kenntnis von dem controller hat? kann man sich beliebig viele op= anlegen? einen für jeden zweck?
    🙂



  • Undertaker schrieb:

    CStoll schrieb:

    - der klassische Dreieckstausch nutzt meinen op= und passt darum auch die unterliegenden Objekte an)

    d.h. du brauchst einen ganz speziellen op=, der eventuell auch kenntnis von dem controller hat? kann man sich beliebig viele op= anlegen? einen für jeden zweck?
    🙂

    Nein, ich habe einen speziellen op= im Controller - der weiß, daß er die vector-Elemente umbiegen muß.



  • Undertaker schrieb:

    rapso schrieb:

    Undertaker schrieb:

    http://en.wikipedia.org/wiki/XOR_swap_algorithm
    🙂

    wenn man assembler auf c(++) anwendet, lol

    ja, hihi, ich weiss - mit einer temporären variable ist man meistens besser dran.
    aber XOR sieht doch schick aus 😉 und ausserdem sind C und assembler ja nicht sooo weit voneinander entfernt.
    🙂

    weit genug um solche unsinnigen dinge zu machen. vielleicht wird es dir verstaendlich wenn du dir ueberlegst, dass eine cpu nur auf registern arbeitet.

    simples swap macht also dann in assembler

    register a = Array[x]
     register b = Array[b]
     Array[x] = b;
     Array[y] = a;
    

    und nun mit dem funky assembler trick von 1980

    register a = Array[x]
     register b = Array[b]
     a^=b;
     b^=a;
     a^=b;
     Array[x] = a;
     Array[y] = b;
    

Anmelden zum Antworten