この配列の場合:
vector<vector<int> > v;
v.push_back(vector<int>(0));
v.back().push_back(1);
v.back().push_back(2);
v.back().push_back(3);
v.back().push_back(4);
{1, 2, 3, 4} を簡単に出力できます。
cout << v[0][0] << endl;
cout << v[0][1] << endl;
cout << v[0][2] << endl;
cout << v[0][3] << endl;
フラット配列としてアクセスするには、次のようにします。
int* z = (int*)&v[0].front();
cout << z[0] << endl;
cout << z[1] << endl;
cout << z[2] << endl;
cout << z[3] << endl;
では、多次元ベクトルにフラットな多次元配列としてアクセスするにはどうすればよいでしょうか? 1 次元ベクトルにアクセスするのと同じ形式は使用できません。
// This does not work (outputs garbage)
int** n = (int**)&v.front();
cout << n[0][0] << endl;
cout << n[0][1] << endl;
cout << n[0][2] << endl;
cout << n[0][3] << endl;
私が見つけた回避策は、これを行うことです:
int** n = new int* [v.size()];
for (size_t i = 0; i < v.size(); i++) {
n[i] = &v.at(i).front();
}
cout << n[0][0] << endl;
cout << n[0][1] << endl;
cout << n[0][2] << endl;
cout << n[0][3] << endl;
アクセスする前にデータの上に各次元を動的に割り当てることなく、フラットな C スタイル配列のような多次元ベクトル全体にアクセスする方法はありますか?
実装において速度は重要ではなく、メンテナンスの明確さが最も重要です。多次元ベクトルは、データを格納するのに最適です。ただし、他の言語から簡単にアクセスできるように、SDK でフラットな C スタイルの配列としてデータを公開することも必要です。つまり、ベクトルを STL オブジェクトとして公開することはできません。
私が思いついた解決策は、処理の最後に一度だけ配列を評価して「平坦化」するため、私のニーズにはうまく機能します。しかし、これについてもっと良い方法はありますか?それとも、独自のデータ構造を再実装せずに、可能な限り最善の方法ですでにそれを行っていますか (フラット化されたコードは数行しかないため、やり過ぎです)。
友達、アドバイスありがとう!