Sort aus <algorithm> und arrays
-
Hallo,
ich bin noch nicht so vertraut mit c++ und habe eigentlich eine einfache Frage, jedoch weiß ich nicht wie ich das umsetzen soll.
ich will in einem zweidimensionalen Array jeweils die Zeilen sortieren mit der vorgefertigten Methode "Sort" aus der "algorithm" library. nun weiß ich nicht, wie ich dieser Methode jeweils die Zeilen geben soll, damit diese sortiert werden. Kann mir da jemand weiter helfen?Gruß,
sfgheady
-
Zweidimensionales Array mit was für Elementen?
Wie entscheidest du für zwei gegebene Zeilen, welche vor der anderen stehen soll?
-
naja ich fülle das Array zunächst mit integer Zahlen.
jetzt will ich einfach zeilenweise über das array mit hilfe einer for-schleife iterieren und die zahlen in dieser zeile sortieren.
es sollte so aussehen:Array vorher
1. 2 3 1 <- in die sort() reinpacken und sortieren, nachher: 1 2 3 in Zeile 1.
2. 3 1 5
3. 5 1 2Array nachher
1. 1 2 3
2. 1 3 5
3. 1 2 5
-
Zeig mal bitte mehr code. Ist das ein std::array? Ist das Array wirklich zeilenweise aufgebaut?
-
hätte ich code, würde ich ihn ja hier reinposten ^^ das ist nur eine idee von mir, welche ich realisieren will. die frage ist einfach, ob ich irgentwie zeilenweise die werte nehmen kann und behandeln kann wie ein eindimensionales array.
z.b. gibt es in anderen sprachen sowas wie das hier array_1[i][], was alle werte in der zeile sind. z.b. kann man sowas kombinieren mit array_2[]=array_1[i][];
nur so grobes beispiel
-
Du kannst zum Beispiel
std::vector<std::vector<int>>nehmen. Dann kannst du jeweils auf den inneren Vectors (= Zeilen)
std::sort()aufrufen.Könnte man natürlich schön alles wegkapseln, aber wir wollen ja nicht übertreiben.
-
hey, übertreiben oder nicht
ist mir eigentlich egal.
das ding ist, ich würde das gerne mit einem array lösen wollen. ein solches array2 3 1
3 1 5
5 1 2wird zeilenweise abgespeichert und lässt sich auch als eindimensionales array darstellen, welches i*j einträge hat, sieht also so hier aus:
2 3 1 3 1 5 5 1 2
also ist array[0][0] äquivalent zu array[0] mit dem einzigen unterschied das man an das letzte element im zweidimensonalen mit array[3][3]= 2 und in eindimensionalen mit array[9]= 2 rankommt. aber wie mache ich das jetzt

-
Zugriff via
std::size_t at = y * x_max + x;?
Dann kannst du auf Zeile n mit folgenden Befehlen zugreifen:std::size_t start = n * x_max; std::size_t end = start + x_max;Und das letzte Element ist 2, 2 bzw. 8.
-
ja das stimmt
nochmal zum verständnis.
was ist dein y, x, x_max, nsfgheady
-
x, y sind die Koordinaten (Zeile, Spalte).
x_max die maximale Zeillenlänge.
n ist einfach nur eine Variable, beinhaltet eine beliebige Zeilennummer.
-
sehr gut, vielen dank. nun ist alles beantwortet.
was ich mich frage ist, wieso ihr immer std:: schreibt und nicht einfach den namespace std; hat das einen Grund? bin noch nicht so der c++ kenner
-
weil dann implizit immer ein std als namespace angenommen wird.
stell dir vor du hast
namespace n1 { void foo(); } namespace n2 { void foo(); }wenn du jetzt
using namespace n1; using namespace n2;machst und irgendwo dann die funktion
foo()aufrufst, weiß man nicht welche funktion genommen werden soll.
deswegen schreibt man dannn1::foo(); n2::foo();und lässt das using namespace weg.
-
...
-
ahhh okay, sauber vielen dank euch allen

-
sfgheady schrieb:
das ding ist, ich würde das gerne mit einem array lösen wollen. ein solches array
Ok. Ich würde es auch mal mit
std::arrayversuchen, wie von Swordfish vorgeschlagen. Das kann alles, was ein Array kann, und noch ein paar Sachen mehr, ausserdem werden implizite "Features" wie Konvertierung zu einem Zeiger und fehlende Wertsemantik behoben. Im Debug-Modus werden ausserdem Fehler wie Index-Überschreitungen schön abgefangen. Das Beste daran,std::arrayist im Release-Modus nicht langsamer als rohe Arrays.Sofern man einen C++11-kompatiblen Compiler hat, spricht nichts mehr dafür, die alten Arrays aus C einzusetzen.
-
Nexus schrieb:
Sofern man einen C++11-kompatiblen Compiler hat, spricht nichts mehr dafür, die alten Arrays aus C einzusetzen.
Wenn man kein C++11 haben sollte (TR1 ist von 2003 und reicht auch schon), dann spricht auch nichts für die alten C-Arrays. Denn eine Klasse identisch zu std::array kann man sich in 1-2 Stunden selber programmieren und dann für alle Ewigkeiten für sämtliche Array-Bedürfnisse benutzen.