Initialisierung eines zweidimensionalen std :: vector

116

Also habe ich folgendes:

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

und ich initialisiere es sehr naiv wie:

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

Und es fühlt sich sehr falsch an ... Gibt es eine andere Möglichkeit, einen Vektor wie diesen zu initialisieren?

Ferenc Deak
quelle
4
Ich würde eine 1d-Vektor-Implementierung für einen 2d-Vektor empfehlen, wenn Sie nicht mehr Platz benötigen als std::vector<int>::max_size(). Hier
andre
Es wäre schön gewesen, wenn mindestens eine der Antworten nicht das Kopieren des inneren Vektors beinhaltete: memset ist schneller als memcpy (und calloc noch besser, wenn der Operator new inline wird).
Marc Glisse

Antworten:

198

Verwenden Sie den std::vector::vector(count, value)Konstruktor, der eine Anfangsgröße und einen Standardwert akzeptiert:

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

Wenn beispielsweise ein anderer Wert als Null 4als Standardwert erforderlich war, gilt Folgendes:

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

Ich sollte auch erwähnen, dass in C ++ 11 eine einheitliche Initialisierung eingeführt wurde, die die Initialisierung von vectorund anderen Containern ermöglicht, indem {}:

std::vector<std::vector<int> > fog { { 1, 1, 1 },
                                    { 2, 2, 2 } };
hmjd
quelle
Was ist, wenn ich die Speicherklasse des std :: vector <std :: vector <int>>as mache static?
Stürmer
39

Angenommen, Sie möchten den 2D-Vektor m * n mit dem Anfangswert 0 initialisieren

wir könnten das tun

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

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

    return 0;
}
Jason
quelle
Ich habe gerade eine 'gute Antwort' wegen dieser Antwort erhalten. Andere Leute gaben bereits die gleiche Antwort, aber diejenigen, die diese befürworten, mögen mir ähnlich sein, als ich zu diesem Beitrag kam, dass wir nicht erkannt haben, dass einige andere Antworten tatsächlich die gleiche Antwort sind. Ich denke, es könnte drei Gründe haben: 1) Dieser Code könnte sofort kopiert, eingefügt und ausgeführt werden. 2) std::Er verlängert sich und die Leute mögen möglicherweise eine kurze und direkte Antwort. 3) Die lange Benennung von Variablen verwirrt Anfänger. Ich bin auch ein Anfänger, weiß nicht wirklich, wie wichtig wir brauchen std::, brauche einen ausführbaren Code, damit ich weiß, was jede Variable tut
Jason
35

Es gibt keine appendMethode in std::vector, aber wenn Sie einen Vektor erstellen möchten, der A_NUMBERVektoren enthält int, von denen jeder other_numberNullen enthält, können Sie dies tun:

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

Die allgemeine Syntax lautet, wie bereits dargestellt:

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

Hier kann der Vektor 'v' als zweidimensionales Array mit 'A_NUMBER' von Zeilen und 'OTHER_NUMBER' von Spalten dargestellt werden, deren Anfangswert auf 'DEFAULT_VALUE' gesetzt ist.

Es kann auch so geschrieben werden:

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

Die Eingabe von Werten in einen 2D-Vektor ähnelt der Eingabe von Werten in ein 2D-Array:

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

Beispiele wurden bereits in anderen Antworten angegeben ....!

sarthakgupta072
quelle
3

Ich denke, der einfachste Weg, dies zu erreichen, ist:

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

10 ist die Größe des äußeren oder globalen Vektors, der der Hauptvektor ist, und 11 ist die Größe des inneren Vektors vom Typ int, und Anfangswerte werden auf 100 initialisiert! Das ist meine erste Hilfe auf dem Stapel, ich denke, es hilft jemandem.

Muhirwa Gabo Oreste
quelle
2

Angenommen, Sie möchten einen zweidimensionalen Ganzzahlvektor mit n Zeilen und m Spalten mit dem Wert ' VAL ' initialisieren.

Schreiben Sie es als

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

Dieser VAL kann eine Ganzzahlvariable oder eine Konstante wie 100 sein


quelle
1

Der empfohlene Ansatz besteht darin, einen Füllungskonstruktor zu verwenden, um einen zweidimensionalen Vektor mit einem bestimmten Standardwert zu initialisieren:

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

Dabei sind M und N Dimensionen für Ihren 2D-Vektor.

Smit
quelle
1

Mein c++ STLCode zur Initialisierung 5*3 2-D vectormitzero


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