2017-11-18 5 views
0

を長として、だから私は、現在のC++でプログラムに取り組んでいます、と私は、次のdeclerationを作りたい:割り当てベクトルの大きさの配列が

methodOne() 
{ 
    vector<int> one; 
    vector<int> two; 
... assigning to one and two... 
    int a = one.size(); 
    int b = two.size(); 
    methodTwo(a, b); 
} 

methodTwo(int a, int b) 
{ 
    int array[a][b]; 
} 

私はこれをしようとすると、私はエラーを取得する:AとBの必須の定数である
私はaとbをconst int a、const int bに代入しようとしました。しかし、それは役に立たなかった。この種のエラーをどのように修正できるかを誰かが知っているかどうかは疑問でした。
あなたが与えることができる任意のヘルプの事前に感謝!

+2

可変長配列は標準のC++ではありません。 – user0042

+0

簡単に「修正」することはできませんが、配列を他のもの(例えば、別のベクトル。 – juanchopanza

+0

コンパイラが "_aとbはconstant_でなければならない"とは、それらが 'constexpr'(つまり、コンパイル時に知られている)である必要があることを意味します。 –

答えて

0

プログラムを実行する前に配列のサイズを知っている必要があります。そのサイズは要素型と同様に完全な型の一部です。

代わりに動的サイズのものが必要です。サイズのstd::vector<int> * bを使用します。

methodTwo(int a, int b) 
{ 
    std::vector<int> array(a * b); 
} 

また、代わりにstd::vector<std::vector<int>>を使用していますが、なぜすべての問題を取ることができますか?それに応じてオフセットを計算することにより、2次元のデータ構造であるかのようにすべての後、あなたはアクセス 1次元ベクトルの要素を次のことができます。

methodTwo(int a, int b) 
{ 
    std::vector<int> array(a * b); 
    // ... 
    int x = 5; 
    int y = 6; 
    auto const element = array[y * a + x]; 
} 
0

私はあなたが

とあなたの配列を置き換えることができますので、あなたはすでに、ベクターを使用してご覧ください

typedef std::vector< std::vector<int> > matrix; matrix name(a, std::vector<int>(b));

+0

これは 'std :: vector マトリックス(a * b)'の利点は何ですか?行列のすべての行には、サイズと容量のための別々の割り当てと(通常)2つの余分なポインタが必要なので、メモリの断片化とメモリの余分な使用が発生します。 –

+0

私はこの答えに従います。 https://stackoverflow.com/questions/6775643/allocating-vectors-or-vectors-of-vectors-dynamically?answertab=active#tab-top –

+0

この回答は解決しません私の推論。 –