Seite 1 von 1

[gelöst] childGroups to integerlist to sort

Verfasst: 11. Mai 2011 07:52
von prinzenrolle
Hallo,
ich habe eine settings Datei,
aus dieser lese ich zahlen von 1-x aus (Untergruppe)
Das klappt auch prima, allerdings stehen die nicht korrekt sortiert in der Liste....

Code: Alles auswählen

(1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 2, 20, 21, 22, 23, 24, 3, 4, 5, 6, 7, 8, 9)
Deswegen will ich sie sortieren.

Hier mein code:

Code: Alles auswählen

    QStringList r;
    QList<int> integerList;
    QSettings settings("config.ini", QSettings::IniFormat);
    settings.beginGroup("Ports");
    r = settings.childGroups();
    for(int i=0;i<r.size();i++)
        integerList.append( r.at(i).toInt() );
    qDebug() << integerList << "size list:" << integerList.size() << "last element:" <<integerList[integerList.size()-1];
    std::sort( (int*)&integerList[0], (int*)&integerList[integerList.size()-1]);
    qDebug() << integerList;
Jetzt ist die Liste leider nur fast sortiert:
Die Konsolen Ausgabe:

Code: Alles auswählen

(1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 2, 20, 21, 22, 23, 24, 3, 4, 5, 6, 7, 8, 9) size list 24 last element: 9 
(1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 9) 
Wieso wird die neun nicht an die richtige stelle sortiert,
die -1 ist richtig sonst schmiert auch das ganze prg ab ;)

Vielen dank für die Antworten.
Ich bin auch für Verbesserungen am Code zu haben,
bin noch blutiger Anfänger.

Danke

Verfasst: 11. Mai 2011 08:15
von franzf
Eigentlich sollte es mit

Code: Alles auswählen

std::sort(vec.begin(), vec.end());
getan sein. Du kannst auch qSort verwenden (Doku mit genau dem Beispiel, welches du hier hast :))

Verfasst: 11. Mai 2011 08:25
von prinzenrolle
Hallo,

danke für die Antwort!
Mit

Code: Alles auswählen

std::sort( integerList.begin(), integerList.end());
funktioniert es auch. Aber was ist der Unterschied im Bezug auf:

Code: Alles auswählen

std::sort( (int*)&integerList[0], (int*)&integerList[integerList.size()-1]); 
Sollte das nicht das gleiche Ergebnis bringen?

Vielen dank!

Verfasst: 11. Mai 2011 08:48
von franzf
http://www.cplusplus.com/reference/algorithm/sort/
Sorts the elements in the range [first,last) into ascending order.
Beachte: "[" Grenze eingeschlossen, ")" Grenze ausgeschlossen. last liegt ein Element hinter dem letzten gültigen Array-Element. Deshlab wird bei dir der letzte Wert nicht korrekt einsortiert.
Wenn es crasht, machst du irgend etwas anderes falsch ;)
Iteratoren (wie begin() und end() welche liefern) sind nur Abstraktionen für Zeiger. In einem vector (wo alle Elemente in einem Array in einem SPeicherblock gehalten werden) kann ein iterator ein primitiver typedef auf T* sein! Deshalb MÜSSEN beide Varianten funktionieren.

Verfasst: 11. Mai 2011 09:01
von prinzenrolle
Hallo,

das .end() hinter dem letzten Element liegt habe ich gesehen.
nur mit

Code: Alles auswählen

&integerList[integerList.size()-1]

ist ja ein Zeiger auf das letzte Element und

Code: Alles auswählen

&integerList[integerList.size()] 
ist ein Zeiger auf das letzte Element + 1 also außerhalb der Bereichsgrenze.
Ist integerList.end() also etwas anderes?

Danke und Gruß

Verfasst: 11. Mai 2011 09:30
von franzf
Und jetzt weiß ich auch, was das Probelm ist: Du baust eine Debug-Version, da werden assertions geworfen. list[list.size()] greift auf einen Index außerhalb des gültigen Bereichs zu -> assert liefert false -> Bang! (Mit schöner, aussagekräftiger Fehlermeldung, die du posten hättest sollen!)

Um direkte Index-Zugriffe zu umgehen, machst du deshalb FOlgendes:

Code: Alles auswählen

std::sort(&ls[0], &ls[0]+ls.size());
Allerdings ist das nicht so schön, da du direkt auf interna des Objekts zugreifst (das Array, das die Daten hält) und du dich auch darauf verlässt, dass das immer so funktioniert.
Deshalb solltest du nach Möglichkeit das public-Interface verwenden, mit seinen ganzen Iteratoren usw., dann wärst du gar nicht in das Problem gerannt :P

Verfasst: 11. Mai 2011 11:35
von prinzenrolle
Hallo,

super vielen dank für die Antwort.
Nun habe ich das ganze verstanden!

Vielen dank und Gruß