2009-11-18 34 views
12

Básicamente me gustaría hacer algo así:¿Pasar arreglos de tamaño fijo en C++?

int[3] array_func() 
{ 
    return {1,1,1}; 
} 

int main(int argc,char * argv[]) 
{ 
    int[3] point=array_func(); 
} 

Pero eso no parece social en C++. Sé que puedo usar vectores, pero como sé que el tamaño de la matriz es una constante, parece que es probable que se produzca una pérdida de rendimiento. También me gustaría evitar un new si puedo, porque la asignación de elementos en la pila es más fácil y también es probable que mejore el rendimiento.

¿Cuál es la solución aquí?

Respuesta

13

Usando C++ 0x, la casi cerrada la sesión nuevo estándar de C++ (ya implementado en los últimos gcc y msvc IIRC), ¡puedes hacerlo exactamente como quieras! Simplemente use std :: array en lugar de int [3].

std::array<int, 3> array_func() 
{ 
    return {1,1,1}; 
} 

int main(int argc,char * argv[]) 
{ 
    std::array<int, 3> point = array_func(); 
} 
18

se puede envolver en una struct, para que sea reembolsable por valor:

struct Vec3 
{ 
    float x[3]; 
} 

Vec3 array_func() 
{ 
    Vec3 x = { 1.f, 1.f, 1.f }; 

    return x; 
} 

no creo que se puede utilizar la sintaxis de matrices inicializador directamente en el estado de retorno. Por supuesto, usted podría introducir un constructor (estructuras son sólo las clases con todos los miembros del público, después de todo):

struct Vec3 
{ 
    Vec3(a, b, c) 
    { 
    x[0] = a; 
    x[1] = b; 
    x[2] = c; 
    } 

    float x[3]; 
} 

Vec3 array_func() 
{ 
    return Vec3(1.f, 1.f, 1.f); 
} 
+4

Esa sería la mejor respuesta, excepto que tal estructura ya existe: http://stackoverflow.com/questions/1755000/1755017#1755017 – sbi

+7

La elegí como la mejor respuesta porque responde mi pregunta, simple y llanamente, sin empujar una biblioteca que no pedí. No es que la respuesta de Litb sea mala, solo encontré la respuesta de desenrollar un poco más clara. –

+3

"... empujando una biblioteca que no pedí ..." Bueno, estamos hablando de 'peor' aquí, no solo de una biblioteca. De todos modos, hay una gran posibilidad de que su implementación de lib estándar venga con 'std :: tr1 :: array' (C++ 03 o TR1) o incluso' std :: array' (C++ 1x), que es exactamente la misma . (Esto demuestra que impulsar no es solo otra biblioteca. Es un banco de pruebas para el próximo estándar de C++, fundado por miembros del comité de STD por exactamente esa razón, tiene _muy_ estándares de alta calidad y revisiones exigentes, y está contribuyendo con un montón de cosas a la próxima biblioteca estándar.) – sbi

21

Ponga la matriz en una estructura. boost::array es un envase de este tipo:

boost::array<int, 3> array_func() { 
    boost::array<int, 3> a = {{ 1, 1, 1 }}; 
    return a; 
} 

int main() { 
    boost::array<int, 3> b = array_func(); 
} 

rápida y sucia:

template<typename E, size_t S> 
struct my_array { 
    E data[S]; 
}; 

Aviso cómo se puede utilizar la sintaxis de inicialización de agregados.

+0

No entiendo por qué esto se sube tanto, usar las características de lenguaje estándar (en este caso, una estructura simple) es mucho más limpio y rápido que invocar el impulso. Aunque recomiendo la estructura con plantilla utilizada aquí, esta es la solución más simple que es más reutilizable, y lo que yo hubiera hecho. – KomodoDave

+0

@KomodoDave ¿sabe usted que puede hacer 'sed, boost, std,' en mi fragmento de arriba y ni siquiera necesita una "estructura simple"? ¡Hurra, nos aterrizan en 2011! a veces, invocando el "impulso inflado" (supongo) puede eventualmente conducir a menos hinchazón que reinventar la rueda. –

+2

@KomodoDave Sugiero que se disminuyan las respuestas incorrectas, y las que realmente no respondan la pregunta. Esta respuesta me parece bien. – jweyrich

2

no puede devolver una matriz de tamaño fijo en C++. puede devolver un puntero a int (que se usaría como una matriz) pero eso requeriría asignar la matriz en el montón utilizando new.

todos modos, se puede pasar la matriz como un argumento a su función:

void array_func(int result[3]) 
{ 
    result[0] = 1; 
    result[1] = 1; 
    result[2] = 1; 
} 

int main(int argc,char * argv[]) 
{ 
    int point[3]; 
    array_func(point); 
} 

sin embargo, esto se parece más a C que en C++ ...

+0

nuevo no es necesario necesariamente. También es posible hacer la matriz estática dentro de la función array_func (si eso es posible depende del curso) – Christian

+1

Um, ¿no se ignora ese '3' en la declaración del parámetro? – sbi

+0

sí, tienes razón, finalmente, ni siquiera estoy seguro de que compile. puede que tenga que omitir el tamaño de la matriz en la declaración de la función ... –

0

boost::array es un contenedor para una matriz basada en pila.

Tenga en cuenta que la asignación de pila solo va a ser más económica que usar 'nuevo' cuando no tenga que copiar matrices grandes.

Cuestiones relacionadas