İki boyutlu bir std :: vektör başlatmak


116

Yani, aşağıdakilere sahibim:

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

ve bunu çok saf bir şekilde başlatıyorum:

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

Ve bu çok yanlış geliyor ... Bunun gibi bir vektörü başlatmanın başka bir yolu var mı?


4
Daha fazla alana ihtiyacınız yoksa, 2d vektör için 1d vektör uygulamasını tavsiye ederim std::vector<int>::max_size(). İşte
andre

Cevaplardan en az birinin iç vektörü kopyalamasını içermemesi güzel olurdu : memset memcpy'den daha hızlıdır (ve yeni operatör satır içi yapılıyorsa calloc daha da iyidir).
Marc Glisse

Yanıtlar:


199

std::vector::vector(count, value)Başlangıç ​​boyutunu ve varsayılan değeri kabul eden yapıcıyı kullanın :

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

4Örneğin, sıfır dışında bir değerin varsayılan olması gerekiyorsa, o zaman:

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

Ayrıca vector, aşağıdakileri kullanarak C ++ 11'de ve diğer kapsayıcıların başlatılmasına izin veren tek tip başlatmanın tanıtıldığından bahsetmeliyim {}:

std::vector<std::vector<int> > fog { { 1, 1, 1 },
                                    { 2, 2, 2 } };

Ne depolama sınıfını yaparsanız std :: vector <std :: vector <int>>olarak static?
forvet

40

Diyelim ki 2B vektörü, m * n, başlangıç ​​değeri 0 olacak şekilde başlatmak istiyorsunuz

bunu yapabilirdik

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

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

    return 0;
}

Bu cevap yüzünden yeni bir 'İyi Cevap' kazandım. Başkaları zaten aynı cevabı verdiler, ancak bu cevabı destekleyenler, bu yazıya geldiğimde bana benziyor olabilir, diğer bazı cevapların aslında aynı cevap olduğunu fark etmedik. Bunun üç nedeni olabileceğini düşünüyorum: 1) bu kod kopyalanabilir, yapıştırılabilir ve hemen çalıştırılabilir 2) std::daha uzun hale getirir ve insanlar kısa ve doğrudan yanıtı sevebilir; 3) Değişkenin uzun isimlendirilmesi yeni başlayanların kafasını karıştırır. Ben de acemiyim, ne kadar önemli ihtiyacımız olduğunu gerçekten bilmiyorum std::, çalıştırılabilir bir koda ihtiyacım var , bu yüzden her değişkenin ne işe yaradığını biliyorum
Jason

35

İçinde appendyöntem yoktur std::vector, ancak her biri sıfır içeren A_NUMBERvektörleri içeren bir vektör yapmak istiyorsanız, bunu yapabilirsiniz:intother_number

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

8

Zaten tasvir edildiği gibi genel sözdizimi şöyledir:

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

Burada, 'v' vektörü, 'A_NUMBER' satır ve başlangıç ​​değeri 'DEFAULT_VALUE' olarak ayarlanmış 'OTHER_NUMBER' sütun ile iki boyutlu bir dizi olarak görselleştirilebilir.

Ayrıca şu şekilde yazılabilir:

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

2 boyutlu bir vektörde değer girmek, 2 boyutlu bir dizide değer girmeye benzer:

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

Örnekler zaten diğer cevaplarda belirtilmiştir ....!


3

Sanırım bunu yapmanın en kolay yolu:

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

10, ana vektör olan dış veya global vektörün boyutudur ve 11, int türünün iç vektörünün boyutudur ve başlangıç ​​değerleri 100 olarak başlatılır! Bu yığınla ilgili ilk yardımım, bence birine yardımcı oluyor.


2

Her biri ' VAL ' değerine sahip n satır ve m sütunlu iki boyutlu bir tamsayı vektörünü başlatmak istediğinizi varsayalım.

Olarak yaz

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

Bu VAL tamsayı tipi bir değişken veya 100 gibi sabit olabilir


1

Önerilen yaklaşım, iki boyutlu bir vektörü belirli bir varsayılan değerle başlatmak için dolgu yapıcısını kullanmaktır:

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

burada, M ve N, 2B vektörünüz için boyutlardır.


1

Benim c++ STLbaşlatılması kodu 5*3 2-D vectorilezero


#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;
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.