Cita de: Gallo en 23 de Enero de 2014, 12:49:48 AM
Ambas cosas las puedes hacer utilizando clases de la c++ standard library, por ejemplo así:Código [Seleccionar]std::vector<std::vector<std::string>> tabla(5);
tabla[0] = std::vector<std::string>(1);
tabla[1] = std::vector<std::string>(1);
tabla[2] = std::vector<std::string>(1);
tabla[3] = std::vector<std::string>(1);
tabla[4] = std::vector<std::string>(1);
std::cin >> tabla[0][0];
std::cout << tabla[0][0];
Ten cuidado al hacer asignaciones del estilo lvalue = llamada al constructor (En plan Java, vamos). Incluso en C++11 con move semantics, el rendimiento de ese tipoc de cosas es horrible. El compilador no es capaz de hacer RVOs (O el tipo de copy elision que se aplique en este caso) con ese tipo de cosas. Así que en el mejor de los casos (C++11 move semantics) tienes ésto:
Código [Seleccionar]
Constructor call
Move assigment
Destructor call
Es decir, ese absurdo rvalue temporal no te lo quitas de encima.
Lo mejor es que uses construcción in-place. En el caso de std::vector, usando emplace_back():
Código [Seleccionar]
constexpr std::size_t filas = 5;
constexpr std::size_t columnas = 5; //Por ejemplo
std::vector<std::vector<std::string>> tabla;
for( std::size_t i = 0 ; i < filas ; ++i )
tabla.emplace_back( columnas );
std::cin >> tabla[0][0];
std::cout << tabla[0][0];
Aunque lo hicieras de la otra manera, piensa que no tiene mucho sentido: Has usado el constructor que inicializa el vector a n elementos (5 en tu caso), y luego creas instancias sueltas que asignas a dichos elementos. Éstas son el tipo de cosas que se hacen en java porque cambiar referencias es gratis y pedir memoria a la JVM es también gratis (No es lo mismo un new/malloc() que un new de Java/C#). Pero en C++ son horribles, ya que utiliza semántica de valor, no de referencia. Incluso con move semantics (Move es menos trabajo que copiar, pero es trabajo).