最初の2次元が固定されている3次元ベクトルを定義したいのですが、3番目のベクトルをループ内で呼び出される関数で動的に埋めたいと思います。
これが許可されているかどうかは完全にはわかりませんが、とにかく次のような方法で実装しようとしました。
#define NUM 6
vector<vector<vector<double> > > foo;
foo.resize(NUM);
for(int j1=0; j1 < NUM; j1++){
foo[j1].resize(NUM);
}
while(<condition>){
fun(foo);
}
ここで、関数funを次のように宣言します
void fun(vector<vector<vector<double> > >& foo){
for(int j1=0; j1<NUM; j1++){
for(int j2=j1+1; j2<NUM; j2++){
if(<condition>){
foo[j1][j2].push_back(<value>);
}
}
}
}
私は最初にこれを5に等しいNUMでテストし、すべてが正常に見えましたが、6に変更しようとすると、セグメンテーション違反が発生しました。
3番目の次元をpush_backで埋めようとしない場合(つまり、push_back行にコメントする場合)でも、引数としてfooを持つ関数を呼び出すだけで、fooの次元が台無しになることがわかりました。挿入すると
cout << foo.size() << endl;
whileループでは、最初の反復後にfooの次元が変化し、NUMから乱数に変化することがわかります。
Linux Ubuntuではエラーが発生しますが、MacOSXではエラーが発生しないため、これはプラットフォームに依存することもわかりました。ですから、私はメモリ割り当てに関して本当に間違ったことをしていると思いますが、正確には何がわかりません。誰かが私にこれを説明できますか?
ご協力ありがとうございました!