El problema lo tengo también en que no tengo claro como declarar que el vector tiene "x" filas y "x columnas", y para empeorar la referencia oficial no me aclara mucho al respecto.
Si, se que el vector se crea vacio, por eso uso precisamente push_back, que supuestamente aumenta el tamaño del vector para acomodar nuevos datos de forma automática
Por ejemplo:
vector<string> Concatena (const vector<string>& A, const vector<string>& B){
vector<string> Salida;
Salida = A;
int tam = B.size();
for (int i=0; i<tam; i++){
Salida.push_back(B[i]);
}
return Salida;
}
El vector Salida lo creo vacío, lo lleno con el contenido del vector A, y luego añado una por una las posiciones del vector B, sin cambiar su tamaño. Teóricamente push_back incluye nuevos datos al final del vector y cambia su tamaño.
Y si, en vectores de una dimensión funciona sin problemas, pero nada, algo se me escapa, probablemente en la notación al pasar a 2 dimensiones.
Entiendo, que :
vector <vector<int> > Entrada(4);
Debería teóricamente de crearme un vector de vectores enteros, inicializando un valor inicial de 4 filas. ¿Es así?... porque incluso intentando entonces introducir datos de las columnas, por ejemplo así
vector <vector<double> > Datos(4);
Datos[0].push_back(0.1);
Datos[0].push_back(0.2);
Datos[0].push_back(0.3);
Datos[0].push_back(0.4);
Datos[1].push_back(2.2);
Datos[1].push_back(1.1);
Datos[1].push_back(0.0);
Datos[3].push_back(-15.0);
Datos[3].push_back(-14.0);
Datos[3].push_back(-13.0);
También "casca", a no ser claro está, que el 4 sea el valor de las columnas (lo cual explicaría porque casca), pero entonces me quedo sin tener claro como declaro las filas.
Esta es la parte que mas me está costando del tema de vectores, el resto lo llevo bastante "sueltito" y progreso sin problemas, pero esa cuestión de vectores en 2D me lleva por la calle de la amargura
PDD. Una solución que me han sugerido... habilitar el standar C++11 en el compilador
int main(){
vector< vector<int> > v ( 3, vector<int> (3) );
v = {
{1,2,3},
{4,5,6},
{7,8,9}
};
cout << v[0].size() << endl;
cout << v[1].size() << endl;
cout << v[2].size() << endl;
}
Y... de momento no explota y parece que funciona.
Actualización
Parece que si... pero no.
Aparentemente mi problema real, es que a la hora de pasar a una función por referencia el vector, no lo hago correctamente, y en el mismo momento en que intente, no ya modificar algo del mismo, sino incluso leer sus propiedades el programa "casca"
Os pongo al corriente...
#include <iostream>
#include <vector>
using namespace std;
vector<int> aplana(const vector< vector<int> >& v , int filas){
vector<int> Salida;
for (int i=0; i<filas; i++){
cout << v[i].size();
}
}
int main(){
vector< vector<int> > v ( 3, vector<int> (4) );
v = {
{1,2,3},
{4,5},
{6,7,8,9}
};
int filas = v.size();
cout << filas << endl;
//aplana(v, 3);
for (int i=0; i<filas; i++){
cout << v[i].size() << endl;
}
}
Como podéis ver, el constructor es "diferente", pero funciona, al menos en C++11 funciona.
Mi duda es si estoy pasando el vector a la función correctamente
const vector< vector<int> >& v
Algo estoy obviamente haciendo mal ahi, porque si paso el vector, e intento leer su longitud
dentro de la función el programa se cuelga, ya sea intentando leer el número de filas, como intentando leer el número de columnas de cada una.
No obstante, si intento
exactamente lo mismo dentro del "main", entonces el problema no aparece y funciona correctamente.
Tengo la impresión (no confirmada) de que cuando paso un vector por referencia a una función, en realidad estoy pasando un puntero (o algo así) y dentro de una función no se comporta como espero (bueno, eso es obvio) y aunque el programa compile, se cuelga.
Supongo que al no haber pasado bien por referencia (o eso creo) el vector, al intentar leerlo es posible que se intenten leer zonas de memoria incorrectas.
Claro, podría hacer las cosas dentro del main, donde ese problema no lo tengo, pero la intención es que la función sea capaz de "desmontar" un vector de vectores y devolverme un solo vector con los contenidos consecutivos, no un caso aislado
Nueva actualización.
Estimados compañeros de foro... quiero matar a alguien, o suicidar a alguien... o pegarle fuego a algo, pero me contendré
Tras días de darle vueltas, tras dolores de cabeza y desesperación, resulta que aparentemente, mi problema es (era) el compilador GNU.
Con
el mismo código, me he instalado el compilador MinGw64, y... funciona.
No me da errores, no explota el programa y el resultado es el esperado.
A falta de que alguien con mas conocimientos que yo (lo cual no es dificil) me diga que "es posible, pero estabas haciendo tal o tal cosa mal", la verdad es que me he quedado bastante "a cuadros" al ver que aparentemente la fuente de mis problemas era esa.
De momento voy a mantener este compilador como "por defecto" y continuaré haciendo experimentos, pero ahora parece que las cosas empiezan a tener sentido.