Inicializando um std :: vector bidimensional

116

Então, eu tenho o seguinte:

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

e estou inicializando-o de maneira muito ingênua, 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);
    }

E parece muito errado ... Existe outra maneira de inicializar um vetor como esta?

Ferenc Deak
fonte
4
Eu recomendaria uma implementação de vetor 1d para um vetor 2d se você não precisar de mais espaço do que std::vector<int>::max_size(). Aqui
andre
Teria sido bom se pelo menos uma das respostas não envolvesse a cópia do vetor interno: memset é mais rápido que memcpy (e calloc ainda melhor se o operador new for embutido).
Marc Glisse

Respostas:

198

Use o std::vector::vector(count, value)construtor que aceita um tamanho inicial e um valor padrão:

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

Se um valor diferente de zero, 4por exemplo, era obrigado a ser o padrão, então:

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

Devo também mencionar que a inicialização uniforme foi introduzida no C ++ 11, que permite a inicialização de vector, e outros contêineres, usando {}:

std::vector<std::vector<int> > fog { { 1, 1, 1 },
                                    { 2, 2, 2 } };
hmjd
fonte
E se eu fizer a classe de armazenamento do std :: vector <std :: vector <int>>que static?
strikersps
39

Digamos que você queira inicializar o vetor 2D, m * n, com o valor inicial de 0

nós poderíamos fazer isso

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

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

    return 0;
}
Jason
fonte
Acabei de receber uma 'boa resposta' por causa dessa resposta. Outras pessoas já deram a mesma resposta, mas aqueles que votaram a favor desta podem ser semelhantes a mim quando vim para este post, que não reconhecemos que algumas outras respostas são na verdade a mesma resposta. Acho que pode ser por três motivos: 1) este código pode ser copiado, colado e executado imediatamente 2) std::torna-o mais longo e as pessoas podem gostar de uma resposta curta e direta; 3) a longa nomenclatura de variáveis ​​confunde os iniciantes. Também sou iniciante, não sei realmente o quão importante precisamos std::, precisamos de um código executável, então eu sei o que cada variável faz
Jason
35

Não há nenhum appendmétodo em std::vector, mas se você quiser fazer um vetor contendo A_NUMBERvetores de int, cada um desses contendo other_numberzeros, você pode fazer o seguinte:

std::vector<std::vector<int>> fog(A_NUMBER, std::vector<int>(OTHER_NUMBER));
Juanchopanza
fonte
8

A sintaxe geral, como já representada, é:

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

Aqui, o vetor 'v' pode ser visualizado como uma matriz bidimensional, com 'A_NUMBER' de linhas, com 'OTHER_NUMBER' de colunas com seu valor inicial definido como 'DEFAULT_VALUE'.

Também pode ser escrito assim:

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

Inserir valores em um vetor 2-D é semelhante a inserir valores em uma matriz 2-D:

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

Exemplos já foram declarados em outras respostas ....!

sarthakgupta072
fonte
3

Acho que a maneira mais fácil de fazer isso é:

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

10 é o tamanho do vetor externo ou global, que é o principal, e 11 é o tamanho do vetor interno do tipo int, e os valores iniciais são inicializados em 100! Essa é a minha primeira ajuda na pilha, acho que ajuda alguém.

Muhirwa Gabo Oreste
fonte
2

Suponha que você deseja inicializar um vetor inteiro bidimensional com n linhas em colunas, cada uma com o valor ' VAL '

Escreva como

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

Este VAL pode ser uma variável do tipo inteiro ou constante como 100


fonte
1

A abordagem recomendada é usar o construtor de preenchimento para inicializar um vetor bidimensional com um determinado valor padrão:

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

onde, M e N são dimensões para seu vetor 2D.

Smit
fonte
1

Meu c++ STLcódigo para inicializar 5*3 2-D vectorcomzero


#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
fonte