PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : <vector2> so sortieren, wie <vector1> sortiert wird



TheTraina
18-05-2010, 20:32
Hallo zusammen :),

ich benutze des öfteren die Containerklasse <vector> von C++. Diese bietet u.a. anderem ja auch eine integrierte sort-Funktion: vector.sort();

Dabei ist mir des öfteren folgende Frage gekommen. Wenn ich nun zwei Vektoren habe. Der eine sei gefüllt (z.B.) mit double-Werten, der andere mit integer-Werten. Beide Vektoren sind in dem Sinne abhängig voneinander, dass das erste Vektorelement des vector1 zu dem ersten Vektorelement des vector2 gehört (verstehe die integerwerte etwa als Identifikationsnummern der double-werte o.ä.). ich will nun die double Werte sortieren. Wie sortiere ich die Integerwerte dementsprechend, so dass die Zugehörigkeit der Paare nach dem Sortieren immer noch besteht. Kurz gefragt:

wie sortiere ich einen vector2 eben so, wie vector 1 mit der sort()-funktion sortiert wird? gibt es da einen einfachen befehl?

Danke schon mal für eure Hilfe. :)

jeebee
18-05-2010, 22:08
das tönt nach einem Fall für std::map (http://www.cplusplus.com/reference/stl/map/).

locus vivendi
18-05-2010, 22:34
ich benutze des öfteren die Containerklasse <vector> von C++. Diese bietet u.a. anderem ja auch eine integrierte sort-Funktion: vector.sort();
Laut Standard gibt es diese Funktion nicht. Es gibt den Container "list", der hat eine Memberfunktion "sort", weil für Listen die generische Sortierfunktion nicht ganz ideal arbeitet. Für vector kann die generische aber gut arbeiten.

Zu deinem eigentlichen Problem:
Eine einfache Funktion gibt es dafür nicht. Ich glaube du musst die Indizes und die Double-Werte zusammen sortieren, also in einem Container. Dazu wird es nötig sein, dass du eine eigene Vergleichsfunktion schreibst, welche nur die Double-Werte berücksichtigt.

Eine Map hilft dir dazu glaube ich erstmal nicht weiter, weil du die Integer ja nicht als Index in die Doubles benutzt (oder doch?).

Für die Zukunft fände ich es auch ganz nützlich, wenn C++ noch eine weitere Sortierfunktion böte, welche nicht nur die Eingabesequenz sortiert, sondern den Austausch der Elemente auch an einer zweiten Sequenz vornimmt. Der zweite Technichal Report für Erweiterungen der C++ Bibliothek ist ja noch nicht verabschiedet, evtl. möchtest du ja ein Paper diesbezüglich für das C++ Komitee schreiben.

TheTraina
19-05-2010, 12:13
danke schon mal für eure antworten


das tönt nach einem Fall für std::map (http://www.cplusplus.com/reference/stl/map/).
kannte ich noch gar nicht, beim drüberschauen sah es so aus, als könnte ich damit was anfangen, muss ich mir aber erst mal genauer anschauen


Laut Standard gibt es diese Funktion nicht. Es gibt den Container "list", der hat eine Memberfunktion "sort", weil für Listen die generische Sortierfunktion nicht ganz ideal arbeitet. Für vector kann die generische aber gut arbeiten.
du hast natürlich recht, hatte das falsch im Kopf, bei meinem problem handelte es sich auch immer um Listen der Container-Klasse <list>


Zu deinem eigentlichen Problem:
Eine einfache Funktion gibt es dafür nicht. Ich glaube du musst die Indizes und die Double-Werte zusammen sortieren, also in einem Container. Dazu wird es nötig sein, dass du eine eigene Vergleichsfunktion schreibst, welche nur die Double-Werte berücksichtigt.
das habe ich auch schon mal wo gelesen (hatte gedacht, vielleicht gibt es eine einfachere methode), diese Vergleichsfunktion wird dann als drittes argument übergeben oder?

also listname.sort(anfang, ende, vergleichsfunktion)

locus vivendi
19-05-2010, 12:45
[...]diese Vergleichsfunktion wird dann als drittes argument übergeben oder?

also listname.sort(anfang, ende, vergleichsfunktion)
Anfang und Ende sind implizit, die kennt das Listenobjekt selber. Sowas schaust du am besten in einer Referenz nach, z.B. der von Dinkumware.

TheTraina
19-05-2010, 14:50
..........

TheTraina
17-06-2010, 23:40
habe (leider erst jetzt) es geschafft mich wieder mit dem problem zu beschäftigen, in dem ich das parallele sortieren von vektoren brauchte.


das tönt nach einem Fall für std::map (http://www.cplusplus.com/reference/stl/map/).

das hat mir sehr geholfen und es hat einwandfrei geklappt :). musste nur anstatt einer einfachen map eine multimap benutzen, in der die keys nicht eindeutig sein müssen. vielen dank noch mal für diesen tipp :).

beste grüße

locus vivendi
18-06-2010, 12:00
Da war ich wohl etwas auf dem Holzweg mit meinem Verdacht das die Map nicht das Richtige für dich wäre. Eine Map ist ja immer sortiert und wie der Name schon andeutet auch und gerade dafür gedacht schnell zugeordnete Werte aufzufinden - beides Eigenschaften die ich anhand deiner Problembeschreibung nicht für wesentlich gehalten hatte. Deshalb bin ich gedanklich näher an der Vector-Lösung gewesen die noch etwas mehr mit deiner (ursprünglichen) Beschreibung gemein hätte.