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?


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

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

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

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 ....!


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ś.


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


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.


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;
    }
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.