program - vector insert c++
Vector multidimensional (8)
¿Cómo puedo crear un vector 2D? Sé que en una matriz 2D, puedo expresarlo así:
a[0][1]=98;
a[0][2]=95;
a[0][3]=99;
a[0][4]=910;
a[1][0]=98;
a[1][1]=989;
a[1][2]=981;
a[1][3]=987;
¿Cómo se puede hacer esto usando el C ++ STL Vector?
Como señaló Ari, vector <vector <int >> es la forma correcta de hacerlo.
Además de eso, en tales casos siempre considero envolver el vector interno (en realidad, lo que representa) en una clase, porque las estructuras complejas de STL tienden a volverse torpes y confusas.
Declaración de una matriz, por ejemplo, con 5 filas y 3 columnas:
vector<vector<int> > new_matrix(5,vector<int>(3));
Otra forma de declaración para obtener el mismo resultado que arriba:
vector<int> Row;
Una fila de la matriz:
vector<Row> My_matrix;
My_matrix es un vector de filas:
My_matrix new_matrix(5,Row(3));
Si no tiene que usar vectores, puede intentar Boost.Multi_array . Aquí hay un link a un breve ejemplo.
Simplemente use el siguiente método para usar el vector 2-D.
int rows, columns; // . . . vector < vector < int > > Matrix(rows, vector< int >(columns,0)); Or vector < vector < int > > Matrix; Matrix.assign(rows, vector < int >(columns, 0)); // Do your stuff here...
Esto creará una matriz de filas de tamaño * columnas y la inicializará con ceros porque estamos pasando un cero (0) como segundo argumento en el constructor, es decir, vector <int> (columnas, 0).
la sugerencia de Dribeas es realmente el camino a seguir.
Para dar un motivo por el que desee ir a la ruta operator (), considere que, por ejemplo, si sus datos son escasos, puede diseñarlos de manera diferente para ahorrar espacio internamente y operator () oculta el problema de implementación interna de su usuario final. es mejor encapsular y permitirle crear espacio o acelerar la mejora de los cambios en el diseño interno más adelante sin romper su interfaz.
vector<vector<int> > a;
std::vector< std::vector< int > > a; // as Ari pointed
Usar esto para una matriz en crecimiento puede volverse complejo, ya que el sistema no garantizará que todos los vectores internos sean del mismo tamaño. Siempre que crezcas en la segunda dimensión, tendrás que cultivar explícitamente todos los vectores.
// grow twice in the first dimension
a.push_back( vector<int>() );
a.push_back( vector<int>() );
a[0].push_back( 5 ); // a[0].size() == 1, a[1].size()==0
Si eso está bien para ti (no es realmente una matriz sino un vector de vectores), deberías estar bien. De lo contrario, deberá poner especial cuidado para mantener estable la segunda dimensión en todos los vectores.
Si está planeando en una matriz de tamaño fijo, entonces debería considerar encapsular en una clase y anular el operador () en lugar de proporcionar la sintaxis de matriz doble. Lea las preguntas frecuentes de C ++ con respecto a esto here
std::vector< std::vector<int> > a;
//m * n is the size of the matrix
int m = 2, n = 4;
//Grow rows by m
a.resize(m);
for(int i = 0 ; i < m ; ++i)
{
//Grow Columns by n
a[i].resize(n);
}
//Now you have matrix m*n with default values
//you can use the Matrix, now
a[1][0]=98;
a[1][1]=989;
a[1][2]=981;
a[1][3]=987;
//OR
for(i = 0 ; i < m ; ++i)
{
for(int j = 0 ; j < n ; ++j)
{ //modify matrix
int x = a[i][j];
}
}