1

C++では、関数のパラメータとして2次元配列を渡す方法と、この関数が2次元配列を返す方法は?

次のように定義された配列がある場合:

struct Hello
{
   int a;
   int b;
};

Hello hello[3][3] = {.......};

関数で上記の配列を返す方法は?

4

4 に答える 4

4

答えは、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 つの例では、戻り値の型を意図的に空白のままにしました。これは、返されるもの (渡された配列または新しく作成されたもの) と所有権ポリシーに依存するためです。

于 2012-12-05T13:34:51.640 に答える
4
Hello(&f(Hello(&In)[3][3])) [3][3] {
    //operations
    return In; 
} 
于 2012-12-05T21:58:27.747 に答える
1

ほとんど判読できません (typedef をお勧めします) が、実行できます。

Hello(&f(Hello(&A)[3][3])) [3][3] {
    // do something with A
    return A; 
} 

これが同じ配列である場合、実際には返す必要はありません。代わりに戻りvoidます - 構文ははるかに簡単になります。

于 2012-12-05T14:30:33.833 に答える
0

私はこのようにするだろう...

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;
}
于 2012-12-05T13:49:39.813 に答える