2016-06-16 15 views
-2

私はベクトルの配列を定義し、この配列を関数に渡したいと思います。 ?ベクトルの配列を関数に渡す方法

void gridlist(std::vector<int> *grid, int rows, int cols){ 
    ..... } 

int rows=4; 
int cols=5; 
std::vector<int> grid[rows][cols]; 

gridlist(grid,rows,cols); 

関数に配列を渡すために私のために働いている唯一の方法は、(*)ポインタであった。

は、ここに私のコードです。

私は以下の説明に従って別の方法を試みました:Passing a 2D array to a C++ functionしかし、私はそれを動作させることはできませんでした。

私はいつも次のエラーを取得する:

could not convert '(std::vector<int> (*)[cols])(& grid)' from 'std::vector<int> (*)[cols]' to 'std::vector<int>' 
     gridlist(grid,rows, cols); 

私は私が間違っているのかわかりません。何が、一般的に、その作業を行う最も安全な方法と考えられていますか? VLA(可変長配列)は、C++での非標準的なものであるためである

template<int rows, int cols> 
void gridlist(std::vector<int> (&grid)[rows][cols]){ 

} 

int main() 
{ 
const int rows=4; 
const int cols=5; 
std::vector<int> grid[rows][cols]; 

gridlist(grid); 
} 

あなたのコードに追加の変更がある、int rows=4;const int rows=4;に:

+3

ベクトルのベクトルまたは 'std :: array'を使うと良いでしょう。 – MikeCAT

+1

std :: vector ** gridを使って、良い2つ星プログラマがしようとしましたか、配列のサイズを型パラメータとして渡しますか? – lorro

+0

ベクトルのベクトルを渡すのはなぜですか? –

答えて

0

あなたは、テンプレートを使用することができます。あなたが動的配列をしたい場合は、代わりにベクトル(whhooh)のベクトルのベクトルを使用することを検討してください:grindlist()std::vector<int> *を期待しながら、ここでstd::vector<std::vector<std::vector<int>>>

0
void gridlist(std::vector<int> *grid, int rows, int cols){ 
    ..... } 

int rows=4; 
int cols=5; 
std::vector<int> grid[rows][cols]; 

gridlist(grid,rows,cols); 

grindは、タイプstd::vector<int>[][]を持っています。あなたはgrindlist()std::vector<int>[] *を期待行う必要があり、またはgrindは、私が代わりにstd::array<>を好むことを提案したい​​3210

であることを確認するかのいずれかがあるだろう:

template<int rows, int cols> 
void gridlist(std::array<std::array<std::vector<int>, cols>, rows>& grid) { 
    ..... } 

constexpr int rows = 4; 
constexpr int cols = 5; 
std::array<std::array<std::vector<int>, cols>, rows> grid; 

gridlist(grid); 
0

場合は、直接2次元配列を渡すことはできません両方の次元の可変サイズが必要です。それは一次元の大きさを修正するために許容できない場合

void gridlist1(std::vector<int> grid[][5],int rows){...} 

は、あなたの代わりに一時変数を使用することができます:

一つの解決策は次のようにcolsの大きさを修正し、あなたの関数を宣言することです

void gridlist(std::vector<int> **grid,int rows, int cols){...} 

と同じようにそれを呼び出します。しかし、私が使用する

const int rows=4; 
const int cols=5; 

std::vector<int> grid[rows][cols]; 

// Temp variable 
std::vector<int>* temp[rows]; 
for (int i = 0; i < rows; ++i) temp[i] = grid[i]; 

gridlist(temp,rows,cols); 
     ^^^^ 

伝統的なCスタイルの配列の代わりにベクトルのベクトルのベクトル。

+0

それは私が実際に作業を続けたものですが、変数のサイズが必要でした。一時変数の回避策に感謝します。 –

関連する問題