1

最初の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ではエラーが発生しないため、これはプラットフォームに依存することもわかりました。ですから、私はメモリ割り当てに関して本当に間違ったことをしていると思いますが、正確には何がわかりません。誰かが私にこれを説明できますか?

ご協力ありがとうございました!

4

2 に答える 2

1

要素の数と、ベクターを埋めるためにコピーを作成するために使用する要素を引数として取るベクター コンストラクターを使用して、希望するサイズの 2D 行列を含む固定数サイズの 3D 行列を実際に作成できます。次のようになります。

#include <iostream>
#include <vector>

int main() {
    const size_t NUM = 6;
    std::vector< std::vector< std::vector<double> > > Matr(NUM, std::vector< std::vector<double> >(NUM, std::vector<double>()));
    std::cout << "num 2D matrices - " << Matr.size() << std::endl;
    for(size_t j1 = 0; j1 < Matr.size(); ++j1){
        std::cout << "num rows - " << Matr[j1].size() << std::endl;
        for(size_t j2 = 0; j2 < Matr[j1].size(); ++j2) {
            Matr[j1][j2].push_back(0.09l);
            std::cout << "num columns - " << Matr[j1][j2].size() << " ";
        }
        std::cout << std::endl;
    }
    return 0;
}
于 2012-05-22T16:47:05.287 に答える
0
foo.resize(NUM);  
for(int j1=0; j1 < NUM; j1++){  
    foo[j1].resize(NUM);
}

ここでサイズを変更していますがfoo[j1]、まだ何もあり ませfoo[j1]ん..まだゴミです。
foo[j1]

于 2012-05-21T12:23:14.230 に答える