Wie definieren Sie einen 2D-array in C++ und STL-ohne memory-manipulation?
Es gibt mehrere Möglichkeiten zum definieren einer 2D-array in C++ und STL-ohne memory-manipulation, und die folgenden codes zeigen zwei verschiedenen Methoden:
int main ()
{
/**************
1 2 3
4 5 6
***************/
//Method 1
const int ROW = 2;
const int COL = 3;
int array1[ROW][COL];
for(int i=0; i<ROW; i++)
for(int j=0; j<COL; j++)
array1[i][j] = i*COL+j+1;
//Method 2
typedef vector<vector<int> > ARRAY;
ARRAY array2;
vector<int> rowvector;
for(int i=0; i<ROW; i++)
{
rowvector.clear();
for(int j=0; j<COL; j++)
rowvector.push_back(i*COL+j+1);
array2.push_back(rowvector);
}
return 0;
}
Meine Frage ist: gibt es andere Möglichkeiten zum definieren des 2D-array? Welche die effizienteste ist? Danke!
int **arr2D ;
Gutes tutorial über arrays in C++
Wenn Ihr array konstanter Größe verwenden Sie Methode 1. Wenn Ihr array hat eine bestimmte Größe zur Laufzeit verwenden Sie Methode 2. Weitere, weniger nützliche Methoden für 2d-arrays sind
std::array<std::array<int, COL>, ROW>
und boost mehrdimensionale arrays.InformationsquelleAutor feelfree | 2012-10-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nicht ohne Manipulation Speicher explizit (malloc/free). Wenn Sie statische reservierten Arrays (1. B.) ordnen Sie den Raum zur compile-Zeit, so können Sie nicht mehr hinzufügen, Zeilen oder Spalten zur Laufzeit.
Dem zweiten Beispiel verwendet
std::vector
versteckt, dass Sie die dynamische Speicherverwaltung . Auf diese Weise können Sie schließlich fügen Sie mehrere Zeilen oder Spalten zur Laufzeit.Wenn Sie nicht brauchen, um dynamisch ändern Sie die array-dimension, dann die erste Lösung ist die einfachere und schnellere (auch wenn ich denke, dass std::vector Implementierung ist schnell genug, um vergleichbar zu statischen array, eleganter und mehr Objekt-orientiert).
Wenn Sie müssen, ändern Sie die array-dimension zur Laufzeit verwenden std::vector, weil es erspart Ihnen den Umgang direkt mit malloc und free.
std::array
oder wählen Sie zwischenstd::vector
undnew
/malloc
. Wenn nur gab es eine Größe unveränderlichstd:array
dass nicht brauchen, um zu wissen, die Größe im Voraus, die verwendet werden könnte für viele Anwendungen wie die Bilder, die ich bekommen über Netzwerk, ich kann nicht wissen, die Größe, aber wenn die Größe bekannt ist, brauche ich nicht die zusätzliche Komplexität vonstd::vector
InformationsquelleAutor Heisenbug
In C++11 verwenden
std::array
:Einige Verwendung:
InformationsquelleAutor PiotrNycz
Eine sehr effiziente Methode zum definieren von arrays ist die dynamische Zuordnung, mit der
new
unddelete
Betreiber. Hier ist ein Beispiel:Der große Vorteil dieses Ansatzes ist, dass, wenn Sie nicht mehr brauchen, der Speicher, das array verwendet, können Sie einfach löschen. Hier ist ein Beispiel für das löschen eines 2D-array:
InformationsquelleAutor Rontogiannis Aristofanis
Ein häufiges Muster ist, welche die 2D-array innerhalb einer Klasse, bietet die entsprechende Schnittstelle. In diesem Fall kann man auch auf andere interne Repräsentationen, wie zum Beispiel einen einzigen Vektor von
rows*cols
Elemente. Die Schnittstelle (in der Regeloperator()(int,int)
Karte die Koordinaten aus dem Anrufer um eine position in der linearen Vektor.Der Vorteil ist, dass Sie die dynamische Zuordnung, aber eine einzelne Zuweisung (im Gegensatz zu den
std::vector<std::vector<int>>
wo jeder Vektor erwerben müssen es eigene Speicher) und in einem block bietet die Lokalität der Daten.InformationsquelleAutor David Rodríguez - dribeas
Gibt es eine Menge von trade-offs hier.
Wenn Sie erklären, eine C-Format 2D-array
int array[height][width]
, dann bekommen Sie wirklich einen zusammenhängenden block im Speicher. Der compiler wandelt Indizes, um Ihre 1D-AdresseWenn Sie eine
vector
vonvectors
, dann jede Zeile wird separat zugeordnet. Die äußerenvector
speichert Zeiger auf die innerevectors
. Die Indizierung wird eine Dereferenzierung, gefolgt von einer Zugabe:vector<vector>
).Wenn Leistung wirklich wichtig ist, müssen Sie zu testen und herauszufinden, welche ist schneller auf Ihre Daten.
Ich denke, die STL-Implementierung könnte eine Optimierung für
vector
vonvector
.InformationsquelleAutor japreiss
Zu erklären, ein 2D-array mit
std::vector
Sie können diese Art der Konstruktion:Dieser erstellt ein 2D array
matrix
Größen
durchm
mit allen Elementen initialisiert, um-1
.Es ist im Grunde eine Verschachtelung der "initialisieren mit
n
Gegenstände von Wertval
" Konstruktor:(Konstruktor-definition kopiert von hier)
InformationsquelleAutor MatthewD
Wenn Sie wissen, die Elemente, bevor die hand, dann könnte man nur tun
int arr[3][3] = {{1,2, 3}, {4, 5, 6}};
Dies sollte effizienter sein, als methode1 und methode2.Verwenden von vector-Sie sind nicht Speicher-manipulation selbst, sondern die vector-Implementierung wird wahrscheinlich eines dynamisch reservierten Arrays.
InformationsquelleAutor kkg