Guten Tag,
ich wollte ein mehrdimensionales Array erstellen, welches dynamisch ist. Es soll in der ersten Zeile ein Element haben, in der zweiten Zeile 2 usw bis zur 12. Zeile mit 12 Elementen. Ich möchte es dynamisch erzeugen, sodass es in der ersten Zeile auch wirklich nur ein Element geben kann. ( heißt nicht wie bei einer Matrix und man lässt einfach die letzteren Spalten frei ). So würde ja Speicher verschwendet werden.
Dazu haben wir in der Vorlesung folgende Vorgabe gehabt :
unsigned int m = 3, n = 4;
double** A = new double*[m];
A[0] = new double[m * n];
for (unsigned int i = 1; i < m; i++)
A[i] = A[i-1] + n; delete[] A[0];
Das ist allerdings für eine 3 x 4 Matrix, also nicht ganz so wie ich es haben wollte, allerdings versteh ich auch nicht so ganz was da genau passiert.
Würde mich freuen wenn mir das jemand erklären könnte.
Mfg
Seite 1 von 1
Mehrdimensionales Array in c++
Anzeige
#2
geschrieben 05. Januar 2014 - 18:55
Dein Code stellt nicht sicher, dass es in der ersten Zeile kein 5. Element gibt. Im Gegenteil: Es existiert sogar. Es stimmt nur mit einem Element der zweiten Zeile überein.
Was du willst, dürfte eher sowas sein:
Dann auf die Vektor-Elemente nur noch mit .at() statt mit [] zugreifen.
Falls du diese Anforderung doch nicht hast und wie im Beispiel arbeiten willst, kannst du folgendes machen:
Dies hat den Vorteil, dass der Speicher am Stück allokiert wird.
MfG TO_Webmaster
Was du willst, dürfte eher sowas sein:
vector<vector<double> > A( 12 ); for( unsigned int i = 0; i < A.size(); ++i ){ A[i].resize( i + 1 ); }
Dann auf die Vektor-Elemente nur noch mit .at() statt mit [] zugreifen.
Falls du diese Anforderung doch nicht hast und wie im Beispiel arbeiten willst, kannst du folgendes machen:
unsigned int n = 12; // Anzahl Zeilen double** A = new double*[n]; // Speicher für Positionen der Zeilenbeginne (eigentlich überflüssig, kann man errechnen) A[0] = new double[( n * ( n + 1 ) ) >> 1]; // Passende Menge an Speicher allokieren for( unsigned int i = 1; i < n; ++i ){ A[i] = A[i-1] + i; // Positionen der Zeilenbeginne errechnen } // Hier eigene Berechnungen delete[] A[0]; // Speicher freigeben delete[] A; // Speicher freigeben
Dies hat den Vorteil, dass der Speicher am Stück allokiert wird.
MfG TO_Webmaster
The old reverend Henry Ward Beecher
called a hen the most elegant creature.
The hen pleased for that,
laid an egg in his hat.
And so did the hen reward Beecher.
called a hen the most elegant creature.
The hen pleased for that,
laid an egg in his hat.
And so did the hen reward Beecher.
#3
geschrieben 06. Januar 2014 - 14:01
Wäre bei std::vector<T> nicht besser mit iteratoren zu arbeiten?
std::vector<std::vector<double>>::iterator
Wer Japanische Produkte kauft, unterstützt den grausamen Walfang
Boykottiert JAPAN
Boykottiert JAPAN
#4
geschrieben 06. Januar 2014 - 14:21
Zitat (Sepultura: 06. Januar 2014 - 14:01)
Wäre bei std::vector<T> nicht besser mit iteratoren zu arbeiten?
Ja, vielleicht. Ob es der Verständlichkeit hier dient, weiß ich aber nicht. Auf jeden Fall danke für den Hinweis! Vielleicht wäre auch ein BOOST_FOREACH sinnvoll.
MfG TO_Webmaster
The old reverend Henry Ward Beecher
called a hen the most elegant creature.
The hen pleased for that,
laid an egg in his hat.
And so did the hen reward Beecher.
called a hen the most elegant creature.
The hen pleased for that,
laid an egg in his hat.
And so did the hen reward Beecher.
Thema verteilen:
Seite 1 von 1