Matrizendarstellung in C++
-
@KelbsSohn sagte in Matrizendarstellung in C++:
Ich möchte auch keine std::vector, std::array usw. benutzen.
Dann nimm ein normales Member-Array statt dessen. Kein dynamisch erzeugtes.
-
Dieser Beitrag wurde gelöscht!
-
@Swordfish sagte in Matrizendarstellung in C++:
int
,unsigned
, doch was anderes? Entscheide Dich.Stimmt. Fixed.
ps: Beim Editieren hat mich grad eiskalt eine mir bisher noch nicht bekannte Funktion des Forums erwischt: wenn man per Copy+Paste etwas einfügt was mit
>
anfängt, dann wird automatisch>
vor allen folgenden Zeilen des kopierten Texts eingefügt. Da ich's erst bemerkt habe nachdem ich schon auf "Absenden" gedrückt hab durfte ich das dann alles wieder per Hand wegmachen.
-
@KelbsSohn sagte in Matrizendarstellung in C++:
Ich möchte auch keine std::vector, std::array usw. benutzen.
Dann läuft das auf eine Allocator Klasse hinaus, wenn man es denn „richtig“ machen will.
-
@john-0 sagte in Matrizendarstellung in C++:
@KelbsSohn sagte in Matrizendarstellung in C++:
Ich möchte auch keine std::vector, std::array usw. benutzen.
Dann läuft das auf eine Allocator Klasse hinaus, wenn man es denn „richtig“ machen will.
Warum? Hier wird doch überhaupt kein dynamischer Speicher benötigt, da die Dimensionen Template-Parameter sind und somit mit
T data[rows * cols]
ein Array angelegt werden kann. Wo muss da ein Allocator ins Spiel kommen?
-
Vielleicht möchte man sich bei der Matrixgröße nicht durch den Stack einschränken lassen.
-
@wob sagte in Matrizendarstellung in C++:
Warum? Hier wird doch überhaupt kein dynamischer Speicher benötigt, da die Dimensionen Template-Parameter sind und somit mit
T data[rows * cols]
ein Array angelegt werden kann. Wo muss da ein Allocator ins Spiel kommen?std::array
& Co. eliminiert die Möglichkeit die Move-Semantik bei nicht trivialen Matrizendimensionen zu nutzen, dazu hat move auf allen Standardcontainer mit dem Standard Allocator O(1) Laufzeitverhalten. Das geht mitstd::array
nicht, da hat man ohne wirklichen Grund O(M×N).Sicherlich lassen sich mit viel Template Metaprogramming auch zwei Matrizen korrekt multiplizieren, wenn man hier nicht nur Hadamard-Produkt implementieren will. Für Anfänger dürfte das mit dynamsicher Allokation während der Laufzeit und simplen Größenvergleichen leichter umzusetzen sein.
-
Dann könnte man immer noch das gesamte Matrix-Objekt auf dem Freispeicher (Heap) erstellen, aber dafür sollte die Matrixklasse frei von Speicherallokationen sein.
-
Oder man implementiert eine Small Matrix Optimization nach Vorbild der Small String Optimization.
-
Man kann auch gerne
unique_ptr<T[]>
verwenden.Wenn man unbedingt möcht kann man sich auch sowas wie
unique_ptr<T[]>
selbst basteln und das dann verwenden.Bloss bitte bitte nicht Resourcenverwaltung mit anderen Dingen zusammen in eine Klasse packen. Das geht viel viel öfter schief als es gut geht.