C++では、関数のパラメータとして2次元配列を渡す方法と、この関数が2次元配列を返す方法は?
次のように定義された配列がある場合:
struct Hello
{
int a;
int b;
};
Hello hello[3][3] = {.......};
関数で上記の配列を返す方法は?
答えは、2 次元配列の意味によって異なります。
C++ の方法は、 を使用することですstd::vector<std::vector<Type> >
。その場合、答えは次のようになります。
typedef std::vector<std::vector<myType> > Array2D;
Array2D f(const Array2D& myArray)
{
}
Type**
次のように配列を動的に割り当てた場合
Type** p = new Type*(n);
for(int i = 0; i < n; ++i)
{
p[i] = new Type(m);
}
次に、ディメンションとともに Type** を渡すだけです。
... f(Type** matrix, int n, int m);
通常の2D配列がある場合
Type matrix[N][M];
次に、次のように渡すことができます
template<int N, int M>
... f(Type (&matrix)[N][M]);
前の 2 つの例では、戻り値の型を意図的に空白のままにしました。これは、返されるもの (渡された配列または新しく作成されたもの) と所有権ポリシーに依存するためです。
Hello(&f(Hello(&In)[3][3])) [3][3] {
//operations
return In;
}
ほとんど判読できません (typedef をお勧めします) が、実行できます。
Hello(&f(Hello(&A)[3][3])) [3][3] {
// do something with A
return A;
}
これが同じ配列である場合、実際には返す必要はありません。代わりに戻りvoid
ます - 構文ははるかに簡単になります。
私はこのようにするだろう...
typedef std::vector< int > vectorOfInts;
typedef std::vector< vectorOfInts > vectorOfVectors;
vectorOfVectors g( const vectorOfVectors & voi ) {
std::for_each( voi.begin(), voi.end(), [](const vectorOfInts &vi) {
std::cout<<"Size: " << vi.size() << std::endl;
std::for_each( vi.begin(), vi.end(), [](const int &i) {
std::cout<<i<<std::endl;
} );
} );
vectorOfVectors arr;
return arr;
}
int main()
{
vectorOfVectors arr( 10 );
arr[0].push_back( 1 );
arr[1].push_back( 2 );
arr[1].push_back( 2 );
arr[3].push_back( 3 );
arr[3].push_back( 3 );
arr[3].push_back( 3 );
g( arr );
return 0;
}