2009-05-17 42 views

Respuesta

12

Las matrices en C/C++ no almacenan sus longitudes en la memoria, por lo que es imposible encontrar su tamaño simplemente dando un puntero a una matriz. Cualquier código que use matrices en esos idiomas depende de un tamaño constante conocido, o de una variable separada que se transmite y que especifica su tamaño.

Una solución común a esto, si presenta un problema, es usar la clase std::vector de la biblioteca estándar, que es mucho más parecida a una matriz administrada (C#), es decir, almacena su longitud y además tiene algunos útiles funciones miembro (para búsqueda y manipulación).

Usando std::vector, simplemente puede llamar al vector.size() para obtener su tamaño/longitud.

+0

¿Es imposible obtener el tamaño? –

+0

@John: Sí, es imposible, tengo miedo. Ver mi respuesta actualizada. std :: vector puede ser su mejor opción. – Noldorin

+0

Esa es mi pregunta, ¿cómo obtener el tamaño de std :: vector? Es como una matriz. Lo siento por malentendidos, soy nuevo en C++. –

0

En C/C++, las matrices son simplemente punteros al primer elemento de la matriz, por lo que no hay forma de realizar un seguimiento del tamaño o el número de elementos. Deberá pasar un número entero que indique el tamaño de la matriz si necesita usarla.

Strings pueden han su longitud determinada, asumiendo que se terminan null, mediante el uso de la función strlen(), pero que simplemente cuenta hasta que el carácter \ 0.

+2

-1 Las matrices no son punteros. – rightfold

0

Als Nolrodin señaló anteriormente, es casi imposible obtener el tamaño de una matriz simple en C++ si solo tiene un puntero a su primer elemento. Sin embargo, si usted tiene una matriz de tamaño fijo no es un conocido truco C para calcular el número de elementos de la matriz en tiempo de compilación, es decir haciendo:

 
GrmblFx loadsOfElements[1027]; 
GrmblFx_length = sizeof(loadsOfElements)/sizeof(GrmblFx); 

14

Realmente depende de lo que quiere decir por "matriz". Las matrices en C++ tendrán un tamaño (es decir, el tamaño de byte "en bruto" ahora) que equivale a N veces el tamaño de un elemento. Por eso uno puede obtener fácilmente el número de elementos usando el operador sizeof. Pero esto requiere que todavía tenga acceso al tipo de esa matriz. Una vez que lo transfiere a las funciones, se convertirá en punteros y luego se perderá. No se puede determinar ningún tamaño más. Deberá construir de otra manera que dependa del valor de los elementos para calcular el tamaño.

Éstos son algunos ejemplos:

int a[5]; 
size_t size = (sizeof a/sizeof a[0]); // size == 5 

int *pa = a; 

Si ahora perdemos el nombre "a" (y por lo tanto su tipo), por ejemplo pasando "pa" a una función que sólo esa función tiene entonces el valor de ese puntero, entonces no tenemos suerte. Entonces no podemos recibir el tamaño más. Tendríamos que pasar el tamaño junto con el puntero a esa función.

Las mismas restricciones se aplican cuando obtenemos una matriz usando new. Devuelve un puntero que apunta a los elementos de esa matriz y, por lo tanto, se perderá el tamaño.

int *p = new int[5]; 
    // can't get the size of the array p points to. 
delete[] p; 

No puede devolver un puntero que tiene el tipo de la matriz incorporada, debido a que el tamaño de la matriz creada con new se puede calcular en tiempo de ejecución. Pero los tipos en C++ se deben establecer en tiempo de compilación. Por lo tanto, new borra esa parte de la matriz y en su lugar devuelve un puntero a los elementos. Tenga en cuenta que no necesita meterse con new en C++. Puede usar la plantilla std::vector, según lo recomendado por otra respuesta.

+0

¿Alguien mencionó '' 'std :: extent''' todavía? – ManuelAtWork

5

para contar el número de elementos en una matriz estática, puede crear una función de plantilla:

template < typename T, size_t N > 
size_t countof(T const (&array)[ N ]) 
{ 
    return N; 
} 

Para contenedores estándar, tales como std::vector, la función de size()se utiliza. Este patrón también se usa con boost arrays, que son matrices de tamaño fijo y no reclaman un rendimiento peor para las matrices estáticas. El código que tiene en un comentario anterior debería ser:

for (std::vector::size_type i(0); i < entries.size(); ++i) 

(suponiendo que los cambios de tamaño en el bucle, de lo contrario izarla,) en lugar de tratar tamaño que una variable miembro.

+0

¿Por qué funciona esto? – Zingam

+0

@Zingam la plantilla? porque una referencia a una matriz conserva el tipo de la matriz, incluido el tamaño, a diferencia de un parámetro que no es de referencia y que se degrada a un puntero. –

+0

¡Gracias! No entiendo la mitad de la plantilla, pero todavía no puedo entender por qué funciona esta afirmación: T const (& array) [N] Los tutoriales sobre las plantillas que estoy leyendo no me dan ninguna pista. – Zingam

Cuestiones relacionadas