あなたの質問を少し具体化させてください。あなたは言及します:
関数から配列[...]を返したいのですが、事前にサイズを知らずに配列を構築したいのでお願いします。サイズは引数として渡されます。動的割り当てを使用せずにこれを行う方法があるかどうか知りたいです。
I want to return an array from a function [...] size passed as an argument の場合、どこでも使用でき、基になる配列へのアクセスが必要なときにstd::vector
そのメソッドを呼び出すことが合理的だと思われます(これは、.data()
連続してください)。例えば:
std:vector<double> myfun(size_t N) {
std::vector<double> r(N);
// fill r[0], r[1], ..., r[N-1]
return r;
}
// later on:
r.data(); // gives you a pointer to the underlying double[N]
I want to do this without dynamic allocationについては、コンパイル時にサイズがわからない限り、それは不可能です。その場合は、以前とまったく同じように行いますがstd::array
、既知のコンパイル時のサイズに基づいて最適化を実装できる を使用します。
std::array<double, N> myfun() {
std::array<double, N> r;
// fill r[0], r[1], ..., r[N-1]
return r;
}
// later on:
r.data(); // gives you a pointer to the underlying double[N]
一般的に言えば、実際には、任意のコンテナーを操作できるテンプレート関数を使用します。
template<typename T>
void myfun(T& data) {
for(int k=0; k<data.size(); k++) {
// do stuff to data[k]
}
}
// call as, for example:
std::vector<double> data(10);
myfun(data);
// or equally valid:
std::array<double, 10> data;
myfun(data);
最後に、2 次元データを扱っている場合は、Matrix を行優先の順序で保存するときは次のことを覚えておいてください。
Matrix [1, 2; 3 4] is stored as [1 2 3 4]
(i, j)
その後、 を呼び出して行列の要素を参照できますdata[i * ncols + j]
。例: 3 行 4 列の行列を考えてみましょう。
a b c d
e f g h
i j k l
要素(2, 2)
(つまり、ゼロベースの C 型インデックスを想定しているため、3 行目、3 列目) は次のように計算されますM[2][2] = M[2 * 4 + 2] = M[10] = k
。これは、次のように保存されているためです。
[a b c d e f g h i j k l]
[0 1 2 3 4 5 6 7 8 9 10 11]
andk
は index を持つ要素10
です。