2次元std :: vectorの初期化


116

だから、私は以下を持っています:

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

そして私はそれを非常に単純に初期化しています:

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

そして、それは非常に間違っていると感じています...このようなベクトルを初期化する別の方法はありますか?


4
より多くのスペースが必要ない場合は、2Dベクトルの1Dベクトル実装をお勧めしますstd::vector<int>::max_size()ここ
2013

答えの少なくとも1つが内部ベクトルのコピーを含まない場合は、良かったでしょう。memsetはmemcpyよりも高速です(そして、operator newがインライン化されれば、callocはさらに良くなります)。
Marc Glisse

回答:


198

std::vector::vector(count, value)初期サイズとデフォルト値を受け入れるコンストラクタを使用します。

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

4たとえば、ゼロ以外の値をデフォルトにする必要がある場合は、次のようになります。

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

C ++ 11で導入された均一な初期化についても言及しておきます。これによりvector、や他のコンテナの初期化が可能になります{}

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

std :: vector <std :: vector <int>>asのストレージクラスを作成するとどうなりstaticますか?
ストライカー

39

2Dベクトルm * nを初期値0で初期化するとします。

私たちはこれを行うことができました

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

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

    return 0;
}

この回答により、「グッドアンサー」を獲得しました。他の人はすでに同じ答えを出していますが、この投稿に賛成した人は私がこの投稿に来たときに私と似ているかもしれません。3つの理由が考えられます。1)このコードがコピー、貼り付け、すぐに実行される可能性があります。2)コードがstd::長くなり、人々は短く直接的な答えを好むかもしれません。3)変数の長い命名は初心者を混乱させます。私も初心者です。どれほど重要かわからないのでstd::、実行可能なコードが必要なので、各変数の機能を理解します
Jason

35

にはappendメソッドはありませんが、それぞれ0 std::vectorを含むのA_NUMBERベクターを含むベクターを作成する場合は、次のようにします。intother_number

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

8

すでに示した一般的な構文は次のとおりです。

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

ここで、ベクトル「v」は、行の「A_NUMBER」、列の「OTHER_NUMBER」の初期値が「DEFAULT_VALUE」に設定された2次元配列として視覚化できます。

また、次のように書くこともできます。

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

2次元ベクトルへの値の入力は、2次元配列への値の入力に似ています。

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

例はすでに他の回答で述べられています...!


3

私はそれを行う最も簡単な方法は次のとおりだと思います:

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

10は主ベクトルである外部ベクトルまたはグローバルベクトルのサイズ、11はint型の内部ベクトルのサイズで、初期値は100に初期化されます。これは私のスタックでの最初のヘルプです。誰かを助けると思います。


2

それぞれが値 ' VAL ' を持つn行m列の2次元整数ベクトルを初期化するとします。

と書く

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

このVALは、整数型の変数または100などの定数にすることができます。


1

推奨されるアプローチは、fillコンストラクターを使用して、指定されたデフォルト値で2次元ベクトルを初期化することです。

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

ここで、MとNは2Dベクトルの次元です。


1

c++ STL初期化5*3 2-D vectorする私のコードzero


#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;
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.