WinFuture-Forum.de: Mehrdimensionales Array in c++ - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
Seite 1 von 1

Mehrdimensionales Array in c++


#1 Mitglied ist offline   DieKillerhuhn 

  • Gruppe: aktive Mitglieder
  • Beiträge: 178
  • Beigetreten: 13. Mai 08
  • Reputation: 0

geschrieben 05. Januar 2014 - 16:21

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
0

Anzeige



#2 Mitglied ist offline   TO_Webmaster 

  • Gruppe: Moderation
  • Beiträge: 3.212
  • Beigetreten: 27. März 02
  • Reputation: 82
  • Geschlecht:Männlich

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:
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.
0

#3 Mitglied ist offline   Sepultura 

  • Gruppe: aktive Mitglieder
  • Beiträge: 663
  • Beigetreten: 18. September 05
  • Reputation: 7
  • Geschlecht:Männlich
  • Wohnort:Dresden
  • Interessen:PC, Internet, C/C++

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
0

#4 Mitglied ist offline   TO_Webmaster 

  • Gruppe: Moderation
  • Beiträge: 3.212
  • Beigetreten: 27. März 02
  • Reputation: 82
  • Geschlecht:Männlich

geschrieben 06. Januar 2014 - 14:21

Beitrag anzeigenZitat (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.
0

Thema verteilen:


Seite 1 von 1

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0