Objekte sortieren

Schnelle objektorientierte, kompilierende Programmiersprache.
florroto
Beiträge: 4
Registriert: Fr Mär 19, 2021 2:19 pm

Objekte sortieren

Beitrag von florroto » Fr Mär 19, 2021 2:29 pm

Hallo,
ich habe eine Frage, evtl kann mir einer weiterhelfen.

ich habe eine map mit Objekten.
Der key ist eine ID und dazu gibt es immer ein Objekt der folgenden Klasse. (siehe Code)
ich möchte nun die Reihenfolge der Objkete ändern. Und zwar möchte ich nach dem StartValue sorterien.

Also zb:
die Map:
0, itemA (hat einen getStartValue von 1000)
1, itemB (hat einen getStartValue von 1009)
2, itemC (hat einen getStartValue von 1003)
3, itemD (hat einen getStartValue von 1005)

soll nun nach den StartValues sortiert werden:
0, itemA (hat einen getStartValue von 1000)
1, itemC (hat einen getStartValue von 1003)
2, itemD (hat einen getStartValue von 1005)
3, itemB (hat einen getStartValue von 1009)

Code: Alles auswählen

class Item
{
public:
    Item();
    void setUniqueID(std::string id);
    std::string getUniqueID();
    void setStartValue(int value);
    int getStartValue();
    
    //...some more functions
private:
    std::string m_id;
    int m_startVaule;
    //...
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    
    // ....
    
    std::map<int, Item*> itemList;
    // sort the itemList dependend on StartValue, but how?!
    return a.exec();
}

ich habe mir qsort und so angesehen, jedoch fehlt mir das Verständnis, das auf Objekte anzuwenden. Bei einfachen arrays kann ich es nachvollziehen, aber hier weiß ich nihct wie ich das mache.
Mir fällt nur folgendes ein:
über die Map iterieren und die Startvalues in einen Vektor schreiben.
Diesen Vektor sortieren mit einer sort funktion
Dann wieder über die Map iterieren und den Vektor mit den Items vergleichen und irgendwie so die Reihenfolge ändern. Aber da gibt es doch bestimmt eine einfachen Weg oder ?

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Objekte sortieren

Beitrag von Xin » Sa Mär 20, 2021 1:03 pm

Hi, florroto,

erstmal bitte Code möglichst kompilierbar posten. Ich habe jetzt QApplication rausgeworfen, weil das nicht erforderlich ist und string und map hinzugefügt. Und schon hatte ich Code an dem ich ausprobieren konnte.

Dann habe ich mir die Frage nochmal durchgelesen und leider erst dann kapiert, dass das nicht nötig ist... ^^
florroto hat geschrieben:
Fr Mär 19, 2021 2:29 pm
ich habe eine map mit Objekten.

ich habe mir qsort und so angesehen, jedoch fehlt mir das Verständnis, das auf Objekte anzuwenden. Bei einfachen arrays kann ich es nachvollziehen, aber hier weiß ich nihct wie ich das mache.
Dann hast Du das schonmal verstanden.

Eine Map ist unsortiert, weil der Zweck der Map ist nicht Dir einen Index für ein Element zu machen, sondern irgendwas anzulegen, dass Du von einem int schnell auf ein Item kommst. Das muss nicht sortiert sein oder eben nicht so, wie Du Dir das vorstellst. Es geht nur darum, schnell von einem Eingabewert zu einem Ausgabewert zu gelangen.

Wenn Du einen sortierten Index brauchst, kopiere die in eine Liste und sortiere die, was Du ja auch beschreiben hast.
florroto hat geschrieben:
Fr Mär 19, 2021 2:29 pm
Mir fällt nur folgendes ein:
über die Map iterieren und die Startvalues in einen Vektor schreiben.
Diesen Vektor sortieren mit einer sort funktion
Dann wieder über die Map iterieren und den Vektor mit den Items vergleichen und irgendwie so die Reihenfolge ändern. Aber da gibt es doch bestimmt eine einfachen Weg oder ?
Schau mal hier. Aber im Prinzip ist das, was Du beschrieben hast.

https://thispointer.com/how-to-sort-a-m ... alue-in-c/
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

nufan
Wiki-Moderator
Beiträge: 2557
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Objekte sortieren

Beitrag von nufan » Sa Mär 20, 2021 6:29 pm

Xin hat geschrieben:
Sa Mär 20, 2021 1:03 pm
Eine Map ist unsortiert, weil der Zweck der Map ist nicht Dir einen Index für ein Element zu machen, sondern irgendwas anzulegen, dass Du von einem int schnell auf ein Item kommst. Das muss nicht sortiert sein oder eben nicht so, wie Du Dir das vorstellst. Es geht nur darum, schnell von einem Eingabewert zu einem Ausgabewert zu gelangen.

Wenn Du einen sortierten Index brauchst, kopiere die in eine Liste und sortiere die, was Du ja auch beschreiben hast.
Ich stimme der grundsätzlichen Aussage zu, dass eine Map nicht die geeignete Datenstruktur für eine Sortierung ist. Der Vollständigkeit halber sei aber angemerkt, dass std::map sehr wohl sortiert ist:
https://en.cppreference.com/w/cpp/container/map
cppreference.com hat geschrieben:Keys are sorted by using the comparison function Compare.
Im Gegensatz zu std::unordered_map:
https://en.cppreference.com/w/cpp/conta ... rdered_map

@florroto:
Kannst du uns vielleicht das Ziel hinter der gewünschten Sortierung erklären? Dann können wir dir bestimmt eine genauere Empfehlung bieten :)

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Objekte sortieren

Beitrag von Xin » Sa Mär 20, 2021 7:30 pm

nufan hat geschrieben:
Sa Mär 20, 2021 6:29 pm
Ich stimme der grundsätzlichen Aussage zu, dass eine Map nicht die geeignete Datenstruktur für eine Sortierung ist. Der Vollständigkeit halber sei aber angemerkt, dass std::map sehr wohl sortiert ist:
Ich verstand so, dass das nach Item::m_startValue sortiert werden soll und nicht nach map-key.

Dass Map selbst sortiert ist, hatte ich in dem Moment aber zugegebenermaßen auch nicht auf dem Schirm. :-|
Kann aber auch sein, dass die Eigenschaft erst mit Einführung von relevant wurde unordered_map zwingend relevant wurde.

So hab ich dann auch was mitgenommen. Danke. :-)
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

nufan
Wiki-Moderator
Beiträge: 2557
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Objekte sortieren

Beitrag von nufan » Sa Mär 20, 2021 8:08 pm

Xin hat geschrieben:
Sa Mär 20, 2021 7:30 pm
nufan hat geschrieben:
Sa Mär 20, 2021 6:29 pm
Ich stimme der grundsätzlichen Aussage zu, dass eine Map nicht die geeignete Datenstruktur für eine Sortierung ist. Der Vollständigkeit halber sei aber angemerkt, dass std::map sehr wohl sortiert ist:
Ich verstand so, dass das nach Item::m_startValue sortiert werden soll und nicht nach map-key.
Habe ich auch so verstanden :) Je nach Kontext könnte man das auch mit m_startValue als Key lösen. Ob das Sinn macht ist aber fraglich ^^

florroto
Beiträge: 4
Registriert: Fr Mär 19, 2021 2:19 pm

Re: Objekte sortieren

Beitrag von florroto » Mo Mär 22, 2021 10:49 am

Ja der Code ist nur so eine Art Beispiel gewesen.
Ähm ja also ich habe so eine Zeitleiste in das man Items schieben kann. Die werden in der Map gespeichert. Daher map, weil man ein Item vor oder nach bestehenden setzen kann.
Der Key gibt den Index an.
Nur kann man auch im nachhinhein die Items wechseln und da brauche ich dann ein update der Map.
Und an dem StartValue erkennt man wann das Item startet. also kann man so auch die Reihenfolge neu definieren bzw herausfinden. Dachte man kann das mit qsort machen.

florroto
Beiträge: 4
Registriert: Fr Mär 19, 2021 2:19 pm

Re: Objekte sortieren

Beitrag von florroto » Mo Mär 22, 2021 11:49 am

qSort(itemList.begin(), itemList.end(), [](Item& a, item& b) -> bool { return a.m_startValue< b.m_startValue; });
sowas muss ich mal probieren.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Objekte sortieren

Beitrag von Xin » Mo Mär 22, 2021 11:57 am

florroto hat geschrieben:
Mo Mär 22, 2021 11:49 am
qSort(itemList.begin(), itemList.end(), [](Item& a, item& b) -> bool { return a.m_startValue< b.m_startValue; });
sowas muss ich mal probieren.
Eine Map enthält ein std::pair< key, value >.
In meinem Verständnis hakt das also.

Desweiteren ist die map, wie ich eben gelernt habe, dem key entsprechend sortiert?
Könnte interessant werden, wenn ein qsort eine Map umsortieren dürfte. 8-|
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

florroto
Beiträge: 4
Registriert: Fr Mär 19, 2021 2:19 pm

Re: Objekte sortieren

Beitrag von florroto » Mo Mär 22, 2021 3:25 pm

ich habs nun geändert.
es ist ein Vektor und dann habe ich auch einfach bubble sort benutzt.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Objekte sortieren

Beitrag von Xin » Mo Mär 22, 2021 3:38 pm

Beim Vector bietet sich qsort doch nun wieder an. :-)
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten