5

ベクトル内の情報を 1D 配列として提示する賢い方法があるかどうか疑問に思っていました。例: 5x3 int 要素のベクトルのベクトルを作成しましょう

vector< vector<int>> iVector;
ivector.resize( 5 );
for(i = 0; i < 5; i++){
    iVector[i].resize(3);
}

しかし今、この構造を 1D 配列に変換したいと思います。

int* myArray = new int[5*3];

したがって、次のように必要な各要素にアクセスできます。

for (i =0;i < 5; i++)
  for(j =0; j< 3; j++)
      myArray[i*3+j] = ...

ベクトルを要素ごとに配列にコピーできることはわかっていますが、ベクトルから配列への変換に直接対処する方法があるかどうか疑問に思っていました。ベクトルは としてアドレス指定できることも知っていますiVector[i][j]が、残念ながら GPU に送信され、GPU はベクトルを認識しないため、配列である必要があります。

4

4 に答える 4

2

std::copy5回使用するだけです。

int* ptrArray = myArray;
for (i =0;i < 5; i++) {
  std::copy(iVector[i].begin(), iVector[i].end(), ptrArray);
  ptrArray += iVector[i].size();
}
于 2012-10-18T11:32:52.023 に答える
2

配列にコピーする以外に、ここでできることは何もありません。GPU は、理解できる以上に、作成した抽象化を理解することはありませんstd::vector。できることは、配列を作成してコピーすることだけです。

于 2012-10-18T11:35:24.973 に答える
1

ベクトルは要素を線形に格納することになっているため、理論的には基になるベクトル全体 (単一のベクトルのみ) を参照できます。

std::vector<int> numbers;
int data[4] = &(numbers[0]);

同様に、2D バージョンでも同じアプローチを試すことができるかもしれません。ただし、あなたの代わりに、行列を処理するために特別に設計されたクラスを使用することを検討します (std::vector() に似たクラスを簡単に作成できます)。

于 2012-10-18T11:31:54.730 に答える