Inicialización de un std :: vector bidimensional

116

Entonces, tengo lo siguiente:

std::vector< std::vector <int> > fog;

y lo estoy inicializando muy ingenuamente como:

    for(int i=0; i<A_NUMBER; i++)
    {
            std::vector <int> fogRow;
            for(int j=0; j<OTHER_NUMBER; j++)
            {
                 fogRow.push_back( 0 );
            }
            fog.push_back(fogRow);
    }

Y se siente muy mal ... ¿Hay otra forma de inicializar un vector como este?

Ferenc Deak
fuente
4
Recomendaría una implementación de vector 1d para un vector 2d si no necesita más espacio que std::vector<int>::max_size(). Aquí
andre
Hubiera sido bueno si al menos una de las respuestas no implicara copiar el vector interno: memset es más rápido que memcpy (y calloc incluso mejor si el operador new se inserta).
Marc Glisse

Respuestas:

199

Utilice el std::vector::vector(count, value)constructor que acepta un tamaño inicial y un valor predeterminado:

std::vector<std::vector<int> > fog(
    A_NUMBER,
    std::vector<int>(OTHER_NUMBER)); // Defaults to zero initial value

Si 4se requería que un valor distinto de cero, por ejemplo, fuera el predeterminado, entonces:

std::vector<std::vector<int> > fog(
    A_NUMBER,
    std::vector<int>(OTHER_NUMBER, 4));

También debo mencionar que la inicialización uniforme se introdujo en C ++ 11, que permite la inicialización de vectory otros contenedores, usando {}:

std::vector<std::vector<int> > fog { { 1, 1, 1 },
                                    { 2, 2, 2 } };
hmjd
fuente
¿Qué pasa si hago la clase de almacenamiento del std :: vector <std :: vector <int>>as static?
strikersps
40

Digamos que desea inicializar el vector 2D, m * n, con un valor inicial de 0

podríamos hacer esto

#include<iostream>
int main(){ 
    int m = 2, n = 5;

    vector<vector<int>> vec(m, vector<int> (n, 0));

    return 0;
}
Jason
fuente
Acabo de obtener una 'Buena respuesta' debido a esta respuesta. Otras personas ya dieron la misma respuesta, pero aquellos que votaron a favor de esta pueden ser similares a mí cuando llegué a esta publicación, que no reconocimos que algunas otras respuestas son en realidad la misma respuesta. Creo que puede deberse a tres razones: 1) este código se puede copiar, pegar y ejecutar de inmediato 2) lo std::hace más largo y la gente puede querer una respuesta corta y directa; 3) el nombre largo de las variables confunde a los principiantes. Yo también soy un principiante, realmente no sé lo importante que necesitamos std::, necesito un código ejecutable, así que sé lo que hace cada variable
Jason
35

No hay ningún appendmétodo en std::vector, pero si desea hacer un vector que contenga A_NUMBERvectores de int, cada uno de los que contienen other_numberceros, puede hacer esto:

std::vector<std::vector<int>> fog(A_NUMBER, std::vector<int>(OTHER_NUMBER));
juanchopanza
fuente
8

La sintaxis general, como ya se describió es:

std::vector<std::vector<int> > v (A_NUMBER, std::vector <int> (OTHER_NUMBER, DEFAULT_VALUE))  

Aquí, el vector 'v' se puede visualizar como una matriz bidimensional, con 'A_NUMBER' de filas, con 'OTHER_NUMBER' de columnas con su valor inicial establecido en 'DEFAULT_VALUE'.

También se puede escribir así:

std::vector <int> line(OTHER_NUMBER, DEFAULT_VALUE)
std::vector<std::vector<int> > v(A_NUMBER, line)

Ingresar valores en un vector 2-D es similar a ingresar valores en una matriz 2-D:

for(int i = 0; i < A_NUMBER; i++) {
     for(int j = 0; j < OTHER_NUMBER; j++) {
         std::cin >> v[i][j]
     }
}

Ya se han indicado ejemplos en otras respuestas ...!

sarthakgupta072
fuente
3

Creo que la forma más sencilla de hacerlo es:

std::vector<std::vector<int>>v(10,std::vector<int>(11,100));

10 es el tamaño del vector externo o global, que es el principal, y 11 es el tamaño del vector interno de tipo int, ¡y los valores iniciales se inicializan en 100! Esa es mi primera ayuda en la pila, creo que ayuda a alguien.

Muhirwa Gabo Oreste
fuente
2

Suponga que desea inicializar un vector entero bidimensional con n filas ym columnas, cada una con el valor ' VAL '

Escríbelo como

std::vector<vector<int>> arr(n, vector<int>(m,VAL));

Este VAL puede ser una variable de tipo entero o una constante como 100


fuente
1

El enfoque recomendado es usar el constructor de relleno para inicializar un vector bidimensional con un valor predeterminado dado:

std::vector<std::vector<int>> fog(M, std::vector<int>(N, default_value));

donde, M y N son dimensiones para su vector 2D.

Smit
fuente
1

Mi c++ STLcódigo para inicializar 5*3 2-D vectorconzero


#include <iostream>
using namespace std;
#include <vector>
int main()
{// if we wnt to initialise a 2 D vector with 0;

    vector<vector<int>> v1(5, vector<int>(3,0));

    for(int i=0;i<v1.size();i++) 
{
        for(int j=0;j<v1[i].size();j++)

           cout<<v1[i][j]<<" ";

            cout<<endl;
    }
}
Ritik Kamboj
fuente