0

全て

多次元 STL ベクトルを使用してデータを C++ に格納しています。私が持っているのは3Dベクトルです

 vector<vector<vector<double>>> vec;

そこから取得したいものは次のとおりです。

 &vec[][1][];    // I need a pointer that points to a 2D matrix located at column 1 in vec

誰でもそうする考えがありますか?何か助けていただければ幸いです。

よろしく

長いです

4

2 に答える 2

1

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 を取得することを期待しますpmatrixpmatrixは double のベクトルのベクトルへのポインターであるためです。したがって、pmatrix[j]参照するのは、 index from のvector -of-vector-of-double (vector-of-double ではない) であり、インデックスは のステップで進みます 。ステートメントは誰が何を知っているかを参照し、プログラムをクラッシュさせる可能性が非常に高くなります。jpmatrixsizeof(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 アプリケーションのコンテナー タイプが間違っています。それがあなたの立場なら、この回答を更新して代替コンテナを提供できます。

于 2013-08-03T19:41:57.017 に答える