Frage

In C ++ Ich möchte etwas tun:

int n = get_int_from_user();

char* matrix = new char[n][n];

matrix[0][0] = 'c';
//...
matrix[n][n] = 'a';

delete [][] matrix;

aber natürlich funktioniert das nicht. Was ist der beste Weg, etwas Ähnliches zu tun? Ich habe einige Lösungen gesehen, aber sie scheinen ziemlich chaotisch.

War es hilfreich?

Lösung

Die manuelle dynamische Art und Weise:

Angenommen, Sie haben eine Reihe von Breite * Höhe wollen, der effizienteste Weg ist, um nur ein eindimensionales Array zu verwenden:

char *matrix = new char[width*height];

es zu löschen:

delete[] matrix;

Um darauf zuzugreifen:

char getArrayValue(char *matrix, int row, int col)
{
  return matrix[row + col*width];
}

es zu ändern:

void setArrayValue(char *matrix, int row, int col, char val)
{
  matrix[row + col*width] = val;
}

Boost-Matrix:

Betrachten boost :: Matrix , wenn Sie können die Abhängigkeit haben.

Sie könnten dann binden in die Boost-linearen Algebra Bibliotheken.

Hier finden Sie einige Beispielcode von boost: : Matrix :

#include <boost/numeric/ublas/matrix.hpp>
using namespace boost::numeric::ublas;
matrix<char> m (3, 3);
for (unsigned i = 0; i < m.size1 (); ++ i)
    for (unsigned j = 0; j < m.size2 (); ++ j)
        m (i, j) = 3 * i + j;

Auf dem Stapel für einige Compiler:

Einige Compiler tatsächlich erlauben Sie Arrays auf dem Stack mit Laufzeit bestimmt Größen zu erstellen. g ++ ist ein Beispiel eines solchen Compilers. Sie können dies durch Standard-VC nicht tun ++ though.

So in g ++ dies gilt Code:

int width = 10;
int height = 10; 
int matrix[width][height];

Drew Halle erwähnt, dass diese C99-Funktion mit variabler Länge Arrays (VLAs) und es kann wohl in jedem modernen Compiler genannt wird eingeschaltet.

Andere Tipps

ich in der Regel etwas tun, wie folgt aus:

char *matrix = new char [width * height];

matrix[i + j * width] = 'c'; // same as matrix[i][j] = 'c';

delete [] matrix;

Was ist std::vector< std::vector<int> > array2d;?

Sie scheinen den ganzen Punkt von C ++ (C mit Klassen) zu fehlen :-). Dies ist die Art von Anwendung, die für eine Klasse schreit heraus, sie umzusetzen.

Sie könnte verwenden nur STL oder andere 3rd-Party-Klassenbibliothek, die ich sicher bin, würde die Datenstruktur, die Sie suchen, aber, wenn Sie Ihre eigene Rolle benötigen, erstellen Sie einfach eine Klasse mit den folgenden Eigenschaften.

  • Konstruktor, die, da n, wird gerade ein neues n * n Array von char erstellen (zum Beispiel Charray) ..
  • Member-Funktionen, die Werte zu erhalten und setzen x.y basierend auf der einfach Charray beziehen sich auf [x * n + y];
  • destructor die delete [] 's das Array.

Für eine echte zweidimensionale Matrix:

int n = get_int_from_user();

char** matrix = new char*[n];
for (int i = 0; i < n; i++) {
    matrix[i] = new char[n];
}

// Operations on matrix.

for (int i = 0; i < n; i++) {
    delete [] matrix[i];
}
delete matrix;

Direkt an der Spitze von meinem Kopf. Fehler, kein Zweifel. Allerdings haben andere Leute einen eleganteren Ansatz geschrieben, denke ich.

boost :: multi_array

es von Hand tun wird ein Chaos sein.

Ich mag den 1-d-Array-Ansatz (die gewählte Antwort von Brian R. Bondy) mit der Erweiterung, dass Sie die Datenelemente in eine Klasse wickeln, so dass Sie müssen nicht separat Spur der Breite zu halten:

class Matrix
{
    int width;
    int height;
    char* data;
public:
    Matrix();
    Matrix(int width, int height);
    ~Matrix();

    char getArrayValue(int row, int col);
    void setArrayValue(int row, int col, char val);
}

Die Implementierung ist eine Übung für den Leser. ;)

Ich denke, das ein guter sein würde.

int n = get_int_from_user();

char **matrix=new (char*)[n];

for(int i=0;i<n;i++)
    matrix[i]=new char[n];

matrix[0][0] = 'c';
//...
matrix[n][n] = 'a';

for(int i=0;i<n;i++)
    delete []matrix;
delete []matrix;
std::vector<int> m;

Dann ruft m.resize () zur Laufzeit.

int* matrix = new int[w*h];

Wenn Sie etwas wie Gauß-Elimination tun, um Ihre Matrix sein sollte

int** matrix = new int*[h];
for(size_t i(0); i < h; ++i)
    matrix[i] = new int[w];

(in Gauß-Elimination wir brauchen in der Regel eine Reihe mit anderen zu tauschen, so dass es besser ist, Zeiger auf Zeilen in konstanter Zeit zu tauschen, anstatt Austausch von in linearer Zeit zu kopieren).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top