vec
多次元構造としてではなく、たまたま double のベクトルのベクトルを要素とするベクトルとして考えるのが最善です。
ご存知かもしれませんが、念のために言っておきますが、このデータ型は必ずしも直方体を表すとは限りません。
すべてのベクトルが各レベルで同じサイズであることを確認した場合vec
にのみ、その「形状」になります。
データ型は、ベクトルが のサイズとは異なるサイズであり、同様に と
は異なるサイズのベクトルであるため、構造が「ぎざぎざ」になるように非常に満足しています。vec[j]
vec[k]
vec[j][n]
vec[j][m]
したがって、 のvector<vector<double>>
インデックス 1 にあるへのポインターを取得する必要がありますvec
。次の方法でそれを行うことができます。
vector<vector<double>> * pmatrix = &vec[1];
ただし、このポインターは、それにアクセスするための不必要に厄介な手段になります
vector<vector<double>>
。あなたは確かに次のようなものを書くことはできません:
double d = pmatrix[j][k];
double
そして、「a でアドレス指定された行列」の座標 (j,k) でa を取得することを期待しますpmatrix
。pmatrix
は double のベクトルのベクトルへのポインターであるためです。したがって、pmatrix[j]
参照するのは、 index from のvector -of-vector-of-double (vector-of-double ではない) であり、インデックスは のステップで進みます
。ステートメントは誰が何を知っているかを参照し、プログラムをクラッシュさせる可能性が非常に高くなります。j
pmatrix
sizeof(vector<vector<double>>)
代わりに、次のように書く必要があります。
double d = (*pmatrix)[j][k];
where(*pmatrix)
によってアドレス指定された vector-of-vector-of-double pmatrix
、または同等ですが、より混乱を招きます。
double d = pmatrix[0][j][k];
はるかに単純な (したがって、自然な C++ の方法) は、 のインデックス 1へのポインターではなく参照を取得することです。次の方法で簡単に実行できます。vector<vector<double>>
vec
vector<vector<double>> & matrix = vec[1];
Nowmatrix
は、 のインデックス 1の別の名前にすぎず、期待どおりに行列単位で処理できます (常に、それがギザギザ配列ではなく行列であることを確認していると仮定します)。vector<vector<double>>
vec
考慮すべきもう 1 つのことは、manu343726 によるコメントで提起されました。この参照を受け取るコードで、その参照をvec[1]
使用して内容を変更できるようにしますか?vec[1]
これには、そのサイズまたはその中のいずれかのサイズの変更が含まvector<double>
れますか?
変更を許可する場合は、それで問題ありません。そうでない場合は、const 参照を取得する必要があります。次の方法でそれを行うことができます。
vector<vector<double> > const & matrix = vec[1];
おそらく、受信コードが s を変更できるようにしたいが、double
それらを含むベクトルのサイズは変更できないようにしたいですか? その場合、std::vector
アプリケーションのコンテナー タイプが間違っています。それがあなたの立場なら、この回答を更新して代替コンテナを提供できます。