¿Cómo crear una array 2D dinámica dentro de una clase en C++?

Una array dinámica es una array que puede crecer, cambiar su tamaño, contiene una tabla dinámica, que es mutable por naturaleza, o una lista de arrays es accesible aleatoriamente, la estructura de datos de la lista de tamaño variable que permite agregar o eliminar elementos.

Supongamos que queremos crear una clase para Graph. La clase almacena la representación de la array de adyacencia del gráfico.

Ejemplo:

CPP

// C++ program to demonstrate class of graphs
class Graph
{
  int V;
  int adj[V][V];  // This line doesn't work
   
  /* Rest of the members */
};
 
int main()
{
}

Salida :

error: invalid use of non-static data
       member 'Graph::V'.

Incluso si hacemos que V sea estático, obtenemos el error «el límite de la array no es una constante entera».

C++ no permite la creación de una array asignada por pila en una clase cuyo tamaño no es constante. Entonces necesitamos asignar memoria dinámicamente. A continuación se muestra un programa simple que muestra cómo asignar dinámicamente una array 2D en una clase de C++ usando una clase para Graph con representación de array de adyacencia. 

C++

// C++ program to demonstrate
// how to allocate dynamic 2D
// array in a class using a Graph
#include <bits/stdc++.h>
using namespace std;
 
// A Class to represent directed graph
class Graph {
    int V; // No. of vertices
 
    // adj[u][v] would be true if there is an edge
    // from u to v, else false
    bool** adj;
 
public:
    Graph(int V); // Constructor
 
    // function to add an edge to graph
    void addEdge(int u, int v) { adj[u][v] = true; }
    void print();
};
 
Graph::Graph(int V)
{
    this->V = V;
 
    // Create a dynamic array of pointers
    adj = new bool*[V];
 
    // Create a row for every pointer
    for (int i = 0; i < V; i++) {
        // Note : Rows may not be contiguous
        adj[i] = new bool[V];
 
        // Initialize all entries as false to indicate
        // that there are no edges initially
        memset(adj[i], false, V * sizeof(bool));
    }
}
 
// Utility method to print adjacency matrix
void Graph::print()
{
    for (int u = 0; u < V; u++) {
        for (int v = 0; v < V; v++)
            cout << adj[u][v] << " ";
        cout << endl;
    }
}
 
// Driver method
int main()
{
    // Create a graph given in the above diagram
    Graph g(4);
    g.addEdge(0, 1);
    g.addEdge(0, 2);
    g.addEdge(1, 2);
    g.addEdge(2, 0);
    g.addEdge(2, 3);
    g.addEdge(3, 3);
 
    g.print();
 
    return 0;
}

Salida :

0 1 1 0 
0 0 1 0 
1 0 0 1 
0 0 0 1 

Nota: memset() se usa por separado para filas individuales. No podemos reemplazar estas llamadas con una llamada porque las filas se asignan en diferentes direcciones y hacer una llamada de memset sería desastroso.

Ejemplo:

// Wrong!! (Rows of matrix at different addresses)
memset(adj, false, V*V*sizeof(bool));

Este artículo es una contribución de Dheeraj Gupta . Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *