2010-11-02 17 views
9

Tengo un pequeño problema con la matriz 1D en C++. Tengo una línea de función siguiente:C++ tamaño dinámico de la matriz

void func(int (&array)[???]) 
{ 
    // some math here; 

    "for" loop { 
     array[i] = something; 
    } 
} 

que llamo las funciones en alguna parte del código, y antes de hacer matemáticas no soy capaz de saber dimensión de la matriz. La matriz va a la función como referencia !, porque la necesito en la función main(). ¿Cómo puedo asignar una matriz como esta ?, entonces ¿matriz con? dimensión va a la función como referencia, entonces tengo que poner la dimensión y escribirle algunos valores.

+5

Realmente su pregunta es un poco confusa. ¿Su problema es la asignación, el acceso o cómo pasar una matriz a una función?Por favor, muestre un código real que ilustre su problema o describa lo que realmente desea hacer. –

+0

Una serie de referencias es una bestia inusual: probablemente no quiera usar referencias de ese tipo. –

+0

@Eamon: no puede tener una matriz de referencias, el código anterior es una referencia a una matriz. –

Respuesta

9

utilizar un puntero, no una referencia:

void func(int *a, int N); 

O, más fácil utilizar un vector:

void func(std::vector<int> &a); 

Los vectores pueden ser asignados con sólo decir

std::vector<int> a(10); 

El número de elementos se pueden recuperar usando a.size().

+0

Eso es todo :) muchas gracias, ¡Saludos! – nykon

14

Dado que utiliza C++, ¿por qué no utilizar un std::vector<>?

+1

+1: para 'std :: vector'. – rubenvb

+0

+1 adicional para vector, los uso todo el tiempo en cualquier momento, no sé qué tan grande será "algo". –

+0

¿Crees que esa respuesta puede ser útil para un principiante? –

10

Otros han mencionado que debe usar std::vector en C++ y tienen razón.

Pero puede hacer que su código funcione haciendo func una plantilla de función.

template <typename T, size_t N> 
void func(T (&array)[N]) 
{ 
    // some math here; 

    "for" loop { 
     array[i] = something; 
    } 
} 
+0

El modo de función de plantilla es un excelente ejemplo de "cómo implementar la funcionalidad ya presente en la Biblioteca estándar" ... – rubenvb

+6

@rubenvb: ¿Qué cree que se está "implementando" aquí? –

+5

Estoy de acuerdo con estos "debe usar un vector"; DE ACUERDO; pero esta respuesta proporciona una manera de resolver y comprender la pregunta principal del OP ... –

5

Si la matriz se pasa a func es una matriz de pila, y no un puntero, puede conservar su tamaño mediante el uso de una plantilla de función:

template <class T, size_t N> 
void func(T(&array)[N]) 
{ 
    size_t array_length = N; // or just use N directly 
} 

int main() 
{ 
    int array[4]; 
    func(array); 
} 

Dicho esto, como ya se ha señalado fuera, std::vector es probablemente la mejor solución aquí.

+0

Eso es interesante. – CiscoIPPhone

+0

pero innecesario, porque dentro de func tienes el parámetro de plantilla N que contiene la misma información (como una constante de tiempo de compilación). –

+0

@ Fabio - a la derecha, señaló. –

0

Además del vector que se ha sugerido, posiblemente pueda usar valarray, que también forma parte de STL y está destinado específicamente a manejar colecciones matemáticas.

0

Lo que debes tener en cuenta, es que las matrices son punteros. Una definición como int array[5] asignará espacio para 5 enteros en la pila y array será la dirección del primer valor. Por lo tanto, para acceder al primer valor de la matriz, se puede escribir

array[0] o *array (que es la misma que *(array + 0))

De la misma forma para recuperar la dirección del tercer elemento, se puede escribir

&array[2] o array + 2

Dado que las matrices se punteros, que no tienen que preocuparse por el tamaño de la matriz en tiempo de ejecución si le gustaría pasarlo a una función, simplemente pasarlo como un puntero:

void func(int *array) 
{ 
    int size; 
    //compute size of the array 
    for (int i = 0; i < size; ++i) 
    { 
     //do whatever you want with array[i] 
    } 
}

Cuestiones relacionadas