Menginisialisasi vektor std :: dua dimensi

116

Jadi, saya punya yang berikut:

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

dan saya memulainya dengan sangat naif seperti:

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

Dan rasanya sangat salah ... Adakah cara lain untuk menginisialisasi vektor seperti ini?

Ferenc Deak
sumber
4
Saya akan merekomendasikan implementasi vektor 1d untuk vektor 2d jika Anda tidak memerlukan lebih banyak ruang daripada std::vector<int>::max_size(). Di sini
andre
Akan lebih baik jika setidaknya salah satu jawaban tidak melibatkan penyalinan vektor bagian dalam: memset lebih cepat daripada memcpy (dan calloc bahkan lebih baik jika operator baru disisipkan).
Marc Glisse

Jawaban:

199

Gunakan std::vector::vector(count, value)konstruktor yang menerima ukuran awal dan nilai default:

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

Jika nilai selain nol, katakanlah 4misalnya, harus dijadikan default maka:

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

Saya juga harus menyebutkan inisialisasi seragam diperkenalkan di C ++ 11, yang memungkinkan inisialisasi vector, dan wadah lainnya, menggunakan {}:

std::vector<std::vector<int> > fog { { 1, 1, 1 },
                                    { 2, 2, 2 } };
hmjd
sumber
Bagaimana jika saya membuat kelas penyimpanan std :: vector <std :: vector <int>>sebagai static?
striker
40

Misalkan Anda ingin menginisialisasi vektor 2D, m * n, dengan nilai awal 0

kita bisa melakukan ini

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

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

    return 0;
}
Jason
sumber
Baru saja mendapatkan 'Jawaban Baik' karena jawaban ini. Orang lain sudah memberikan jawaban yang sama, tetapi mereka yang memberikan suara positif yang satu ini mungkin mirip dengan saya ketika saya datang ke posting ini, bahwa kami tidak menyadari bahwa beberapa jawaban lain sebenarnya adalah jawaban yang sama. Saya pikir itu mungkin karena tiga alasan: 1) kode ini dapat disalin, ditempel, dan dijalankan segera 2) std::membuatnya lebih panjang dan orang mungkin menyukai jawaban yang singkat dan langsung; 3) penamaan variabel yang panjang membingungkan pemula. Saya seorang pemula juga, tidak begitu tahu betapa pentingnya kita membutuhkan std::, membutuhkan kode yang dapat dijalankan jadi saya tahu apa yang dilakukan setiap variabel
Jason
35

Tidak ada appendmetode masuk std::vector, tetapi jika Anda ingin membuat vektor yang berisi A_NUMBERvektor int, masing-masing berisi other_numbernol, maka Anda dapat melakukan ini:

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

Sintaks umum, seperti yang sudah digambarkan adalah:

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

Di sini, vektor 'v' dapat divisualisasikan sebagai larik dua dimensi, dengan 'A_NUMBER' baris, dengan 'OTHER_NUMBER' kolom dengan nilai awalnya disetel ke 'DEFAULT_VALUE'.

Juga bisa ditulis seperti ini:

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

Memasukkan nilai dalam vektor 2-D mirip dengan memasukkan nilai dalam larik 2-D:

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

Contoh telah dinyatakan dalam jawaban lain ....!

sarthakgupta072
sumber
3

Menurut saya cara termudah untuk melakukannya adalah:

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

10 adalah ukuran vektor luar atau global, yang merupakan yang utama, dan 11 adalah ukuran vektor bagian dalam tipe int, dan nilai awal diinisialisasi ke 100! Itu bantuan pertama saya di tumpukan, saya pikir itu membantu seseorang.

Muhirwa Gabo Oreste
sumber
2

Misalkan Anda ingin menginisialisasi vektor integer dua dimensi dengan n baris dan kolom m masing-masing memiliki nilai ' VAL '

Tulis sebagai

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

VAL ini dapat berupa variabel tipe integer atau konstanta seperti 100


sumber
1

Pendekatan yang disarankan adalah menggunakan konstruktor isian untuk menginisialisasi vektor dua dimensi dengan nilai default yang diberikan:

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

di mana, M dan N adalah dimensi untuk vektor 2D Anda.

Smit
sumber
1

Saya c++ STLkode untuk menginisialisasinya 5*3 2-D vectordenganzero


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