2012-04-23 13 views
12

¿Cómo puedo encontrar el tamaño de una matriz 2D en C++? ¿Hay alguna función predefinida como sizeof para determinar el tamaño de la matriz?cómo encontrar el tamaño de la matriz 2d en C++

Además, ¿alguien puede decirme cómo detectar un error en el método getvalue para matrices al intentar obtener un valor que no está configurado?

+1

Si la matriz es de caracteres, 'strlen'. De lo contrario, usa vectores. Ellos conocen su tamaño, y se recupera a través de 'vector :: size()'. Incluso con personajes, debes usar una cadena. Tiene ambos 'size()' y 'length()'. – chris

Respuesta

14
sizeof(yourObj)/sizeOf(yourObj[0]) 

debe hacer el truco

+0

Solo en un ámbito donde la matriz se declara como 'elementType Foo [] []', si la matriz se ha descompuesto en un puntero, esto no funciona. Lo que hace que sea difícil determinar el tamaño en tiempo de ejecución. Es por eso que las sugerencias para usar 'std :: vector' o alguna clase de matriz hecha a pedido. – dmckee

+0

es bueno saberlo. no han trabajado tan estrechamente con C++ – Baz1nga

12

Utilice un std::vector.

std::vector< std::vector<int> > my_array; /* 2D Array */ 

my_array.size(); /* size of y */ 
my_array[0].size(); /* size of x */ 

O, si sólo se puede utilizar un buen ol' matriz, puede utilizar sizeof.

sizeof(my_array); /* y size */ 
sizeof(my_array[0]); /* x size */ 
0

Las demás respuestas arriba han respondido a su primera pregunta. En cuanto a su segunda pregunta, la forma de detectar un error de conseguir un valor que no está establecido, no estoy seguro de cuál de las siguientes situaciones decir:

  1. Acceso a un elemento de matriz usando un índice no válido:
    Si usa std :: vector, puede usar el vector :: en la función en lugar del operador [] para obtener el valor, si el índice no es válido, se lanzará una excepción out_of_range .

  2. Accediendo a un índice válido, pero el elemento no se ha establecido aún: Por lo que yo sé, no hay una forma directa de hacerlo. Sin embargo, las siguientes prácticas comunes de probablemente puedan resolver su problema: (1) Inicializa todos los elementos en un valor que usted está seguro de que es imposible tener. Por ejemplo, si está tratando con enteros positivos, configure todos los elementos en -1, para que sepa que el valor aún no está establecido cuando lo encuentre -1. (2) Simplemente use una matriz bool del mismo tamaño para , indique si el elemento del mismo índice está configurado o no, este se aplica cuando todos los valores son "posibles".

19

Supongamos que solo se le permite usar una matriz, entonces puede encontrar el tamaño de una matriz de 2 d de la siguiente manera.

int ary[][5] = { {1, 2, 3, 4, 5}, 
        {6, 7, 8, 9, 0} 
       }; 

    int rows = sizeof ary/sizeof ary[0]; // 2 rows 

    int cols = sizeof ary[0]/sizeof(int); // 5 cols 
1
#include<iostream> 
using namespace std ; 
int main() 
{ 
    int A[3][4] = { {1,2,3,4} , {4,5,7,8} , {9,10,11,12} } ; 
    for(int rows=0 ; rows<sizeof(A)/sizeof(*A) ; rows++) 
    { 
     for(int columns=0 ; columns< sizeof(*A)/sizeof(*A[0]) ; columns++) 
     { 
      cout<<A[rows][columns] <<"\t" ; 
     } 
     cout<<endl ; 
    } 
} 
+0

Por favor, documente cómo esta respuesta es correcta. – rfornal

4
#include <bits/stdc++.h> 
using namespace std; 


int main(int argc, char const *argv[]) 
{ 
    int arr[6][5] = { 
     {1,2,3,4,5}, 
     {1,2,3,4,5}, 
     {1,2,3,4,5}, 
     {1,2,3,4,5}, 
     {1,2,3,4,5}, 
     {1,2,3,4,5} 
    }; 
    int rows = sizeof(arr)/sizeof(arr[0]); 
    int cols = sizeof(arr[0])/sizeof(arr[0][0]); 
    cout<<rows<<" "<<cols<<endl; 
    return 0; 
} 

de salida: 6 5

0

int arr [5] [4];

Para el subíndice fila (4 aumento a 2, incluyen cmath utilizar pow):

sizeof(arr1)/pow(4,2) 

Columna subíndice:

sizeof(*arr1)/4 

4 significa 4 bytes, el tamaño de int.

2

Junto con la macro _countof() puede hacer referencia al tamaño de la matriz usando notación de puntero, donde el nombre de la matriz se refiere a la fila, el operador de indirección se refiere a la columna.

#include <iostream> 
#include <iomanip> 

using namespace std; 

int main() 
{ 
    int beans[3][4]{ 
     { 1, 2, 3, 4 }, 
     { 5, 6, 7, 8 }, 
     { 9, 10, 11, 12 } 
    }; 

    cout << "Row size = " << _countof(beans) // Output row size 
     << "\nColumn size = " << _countof(*beans); // Output column size 
    cout << endl; 

    // Used in a for loop with a pointer. 

    int(*pbeans)[4]{ beans }; 

    for (int i{}; i < _countof(beans); ++i) { 

     cout << endl; 

     for (int j{}; j < _countof(*beans); ++j) { 

      cout << setw(4) << pbeans[i][j]; 
     } 
    }; 

    cout << endl; 
} 
Cuestiones relacionadas