Inicjalizacja dwuwymiarowego std :: vector

116

Mam więc następujące rzeczy:

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

i inicjalizuję go bardzo naiwnie:

    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);
    }

I czuje się bardzo źle ... Czy jest inny sposób inicjalizacji takiego wektora?

Ferenc Deak
źródło
4
Poleciłbym implementację wektora 1d dla wektora 2d, jeśli nie potrzebujesz więcej miejsca niż std::vector<int>::max_size(). Tutaj
andre
Byłoby miło, gdyby przynajmniej jedna z odpowiedzi nie obejmowała kopiowania wewnętrznego wektora: memset jest szybszy niż memcpy (a calloc nawet lepiej, jeśli operator new zostanie wstawiony).
Marc Glisse

Odpowiedzi:

199

Użyj std::vector::vector(count, value)konstruktora, który akceptuje rozmiar początkowy i wartość domyślną:

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

Jeśli wartość inna niż zero, 4na przykład, musiała być wartością domyślną, to:

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

Powinienem również wspomnieć, że jednolita inicjalizacja została wprowadzona w C ++ 11, co pozwala na inicjalizację vectori innych kontenerów przy użyciu {}:

std::vector<std::vector<int> > fog { { 1, 1, 1 },
                                    { 2, 2, 2 } };
hmjd
źródło
Co się stanie, jeśli ustawię klasę pamięci na std :: vector <std :: vector <int>>as static?
napastnicy
40

Powiedzmy, że chcesz zainicjować wektor 2D, m * n, z wartością początkową równą 0

moglibyśmy to zrobić

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

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

    return 0;
}
Jason
źródło
Właśnie uzyskałem „dobrą odpowiedź” dzięki tej odpowiedzi. Inni ludzie już udzielili tej samej odpowiedzi, ale ci, którzy głosowali za tą, mogą być podobni do mnie, kiedy przyszedłem do tego posta, że ​​nie rozpoznaliśmy, że niektóre inne odpowiedzi są w rzeczywistości tą samą odpowiedzią. Myślę, że może to być spowodowane trzema powodami: 1) ten kod można skopiować, wkleić i od razu uruchomić 2) std::wydłuża go i ludzie mogą chcieć krótkiej i bezpośredniej odpowiedzi; 3) Długie nazewnictwo zmiennych dezorientuje początkujących. Jestem też początkującym, nie bardzo wiem, jak ważny jest nam potrzebny std::kod, potrzebuję kodu do uruchomienia, więc wiem, co robi każda zmienna
Jason,
35

W programie nie ma appendmetody std::vector, ale jeśli chcesz utworzyć wektor zawierający A_NUMBERwektory int, każdy z tych zawierających other_numberzera, możesz to zrobić:

std::vector<std::vector<int>> fog(A_NUMBER, std::vector<int>(OTHER_NUMBER));
juanchopanza
źródło
8

Ogólna składnia, jak już przedstawiono, to:

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

Tutaj wektor „v” można wizualizować jako dwuwymiarową tablicę, zawierającą „A_NUMBER” wierszy, z „OTHER_NUMBER” kolumnami i ich początkową wartością ustawioną na „DEFAULT_VALUE”.

Można to również zapisać w ten sposób:

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

Wprowadzanie wartości w wektorze 2-w jest podobne do wprowadzania wartości w tablicy 2-W:

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

Przykłady zostały już podane w innych odpowiedziach ....!

sarthakgupta072
źródło
3

Myślę, że najłatwiej to zrobić:

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

10 to rozmiar zewnętrznego lub globalnego wektora, który jest głównym, a 11 to rozmiar wewnętrznego wektora typu int, a wartości początkowe są inicjalizowane na 100! To moja pierwsza pomoc na stosie, myślę, że pomaga to komuś.

Muhirwa Gabo Oreste
źródło
2

Załóżmy, że chcesz zainicjalizować dwuwymiarowy wektor liczb całkowitych z n wierszami im kolumnami, z których każdy ma wartość „ VAL

Napisz to jako

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

Ta VAL może być zmienną typu integer lub stałą, na przykład 100


źródło
1

Zalecanym podejściem jest użycie konstruktora wypełnienia do zainicjowania dwuwymiarowego wektora z podaną wartością domyślną:

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

gdzie, M i N są wymiarami twojego wektora 2D.

Smit
źródło
1

Mój c++ STLkod do zainicjowania 5*3 2-D vectorzzero


#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
źródło