2012-02-02 21 views
8

Estoy buscando un método para inicializar una estructura compleja que contiene vector en una sola fila.Inicializar una estructura que contiene el vector

Por ejemplo si tengo esta estructura:

struct A{ 
    double x; 
    double y; 
}; 
struct B{ 
    double z; 
    double W; 
}; 
struct C{ 
    A a; 
    B b; 
}; 

que se puede inicializar el C de esta manera: C c = {{0.0,0.1},{1.0,1.1}};

pero lo que si tengo que inicializar una estructura como esta?

struct A{ 
    double x; 
    double y; 
}; 
struct B{ 
    vector<double> values; 
}; 
struct C{ 
    A a; 
    B b; 
}; 

que tienen que hacerlo en una sola fila, porque quiero que los usuarios de mi solicitud para especificar en un solo campo todos los valores iniciales. Y, por supuesto, preferiría una forma estándar de hacerlo y no una personalizada.

Gracias!

+0

¿Cómo los usuarios especificar valores iniciales? Si se trata de un archivo de configuración, si especifica el formato, puede permitir uno. Luego analízalo en la estructura en tu C++ usando más de una línea. –

Respuesta

9

Puede inicializar C de una manera muy similar en C++ en C:

C c = {{0.3, 0.01}, {{14.2, 18.1, 0.0, 3.2}}}; 
+5

Siempre que su compilador sea compatible con la sintaxis de inicialización de C++ 11. –

+0

No creo que esto funcione muy ampliamente todavía. Inicializar un 'vector' con una lista como esa requiere C++ 11 – Managu

+3

@MikeSeymour - Como la pregunta no especificaba un compilador, supongo que el OP hacía la pregunta sobre C++ como lo especifica el estándar. – Mankarse

0

usted puede hacer esto:

C obj = { { 0.0, 0.1f }, std::vector<double>(2, 0.0) }; 

Pero, obviamente, no es ideal ya que todos los valores en su vector necesito ser el mismo

+0

solo especificó que necesitaba inicializarse, no establecerse. jaja – L7ColWinters

-1
struct C { 
    A a; 
    B b; 
    C(double ta[2], vector<double> tb) { 
     a = A(ta[0],ta[1]); // or a.x = ta[0]; a.y = ta[1] 
     b = tb; 
    } 
}; 

entonces se puede inicializar con algo como

C c = C({0.0, 0.1} , vector<double> bb(0.0,5)); 
+0

Esto no funciona. Error: el nombre del tipo no está permitido –

0

La pregunta es cómo inicializar B en el segundo ejemplo?

No se puede inicializar un vector de la siguiente manera:

std::vector<int> v = { 1, 2, 3 }; // doesn't work 

Usted puede hacer esto

int data[] = { 1, 2, 3 }; 
std::vector<int> v(&data[0], &data[0]+sizeof(data)/sizeof(data[0])); 

(hay maneras más agradables de hacer eso). Sin embargo, eso no es un "line-line".

Esto funciona y he probado:

template< typename T > 
struct vector_builder 
{ 
    mutable std::vector<T> v; 
    operator std::vector<T>() const { return v; } 
}; 

template< typename T, typename U > 
vector_builder<T>& operator,(vector_builder<T>& vb, U const & u) 
{ 
vb.v.push_back(u); 
return vb; 
} 

struct B 
{ 
    vector<double> v; 

}; 

B b = { (vector_builder(),1.1,2.2,3.3,4.4) }; 

C c = { {1.1, 2.2 }, {(vector_builder(),1.1,2.2,3.3,4.4)} }; 
0

que sólo tendrá que usar one of the constructors si usted no tiene la nueva sintaxis de inicialización C++ 11.

C c = {{1.0, 1.0}, {std::vector<double>(100)}}; 

El vector anterior tiene 100 elementos. No hay forma de inicializar cada elemento de forma única en la construcción de un vector.

Se podría hacer ...

double values[] = {1, 2, 3, 4, 5}; 
C c = {{1.0, 1.0}, {std::vector<double>(values, values+5)}}; 

o si siempre se conoce el número de elementos utilizar un std :: matriz que se puede inicializar la forma que desee.

3

Si usted no está usando C++ 11 (lo que no puede utilizar la sugerencia de Mankarse), impulso puede ayudar:

C c = { {0.1, 0.2}, {boost::assign::list_of(1.0)(2.0)(3.0)} }; 
Cuestiones relacionadas