4

私のコードでは、配列の配列を考慮する必要があります。ここで、内部配列は固定次元です。 STLアルゴリズムを利用するには、データを実際に配列の配列として格納するのが便利ですが、データをCライブラリに渡す必要があります.Cライブラリには、平坦なCスタイルの配列が必要です。多次元配列構造体のC++配列

多次元アレイを安価にかつ携帯可能に変換(すなわち平坦化)できることは素晴らしいことです。私は非常に単純なケースに固執する、実際の問題はより一般的です。

struct my_inner_array { int data[3]; }; 
std::vector<my_inner_array> x(15); 

xと同じエントリを含むサイズ45 *のはsizeof(INT)のメモリの連続ブロックへのポインタ

&(x[0].data[0]) 

か?あるいは、私はアライメントについて心配する必要がありますか?私はこれが(少なくとも特定のデータ型と内部配列のサイズでは)私にとってはうまくいくが、ポータブルではないことに恐れている。

  1. このコードは移植可能ですか?
  2. そうでない場合は、動作させる方法はありますか?
  3. もしそうでない場合、私は何をすることができますか?
  4. my_inner_arrayがPOD構造体ではなく、(クラスに仮想メソッドが含まれていない限り)いくつかのメソッドが含まれていれば、何も変更されませんか?
+0

このような大きなフラットアレイを最初に使用し、適切な場所で[p、p + stride]チャンクを渡すのが適切ですか?標準的なアルゴリズムは、それらが配列全体またはその一部で動作するかどうかを抽象化するようにします。 –

+0

@LucDanton:たとえば、頂点の配列に関数を適用したいとします。私はstd :: transform(coord.begin()、coord.end()、values.begin()、f)を使いたいと思います。ここで、fはstd :: function です。 std :: transformやその他のSTLアルゴリズムを直接適用する方法は他にありません。 –

+0

'adapt(f)'がファンクションの開始部分と終了部分を取得するファンクタを返す 'std :: transform(coord.begin()、coord.end()、values.begin()、adapt(f))'要素の範囲を 'f'に渡すことができます(これは、配列だけでなくイテレータのペアでも書き込むことができます)。あるいは、それ自体を扱うことができる汎用の 'f'を書くことができます。 Boost.Rangeのようなものを使うなら、 'adapt'ステップも必要ありません。 –

答えて

2

1理論的には、コンパイラは、my_inner_arrayにパディングを追加することができます。実際には、コンパイラが配列を持つ構造体にパディングを追加する理由はわかりません。そのような場合には、そのような構造体の配列を作成する際の位置合わせの問題はありません。

typedef int my_inner_array_array[3]; 
BOOST_STATIC_ASSERT(sizeof(my_inner_array) == sizeof(my_inner_array_array)); 

4仮想メソッドがない場合は、違いはありません。