2016-04-08 12 views
0

大きなデータセットの距離行列を作成し、十分に近い要素のみを保存したいと考えています。コードは次のようになります。C++でベクトル配列を作成

vector<double> * D; 
D = (vector<double> *) malloc(dim *sizeof(vector<double>)) ; 

for(i=0;i<dim;i++){ 
    for(j=i+1;j<dim;j++){ 
     dx = s[j][0] - s[i][0]; 
     dy = s[j][1] - s[i][1]; 
     d = sqrt(dx*dx + dy*dy); 
     if(d < MAX_DISTANCE){ 
      D[i].push_back(d); 
      D[j].push_back(d); 
      } 
     } 

これは私にセグメンテーションフォルトを与えます。私は正しくベクトルの配列を定義していないと思います。これをどうやって回避するのですか?

+3

C++で 'malloc'を使用しないでください。 – songyuanyao

+0

ベクトルのベクトルを作ることができるときに、なぜベクトルの配列を作るのですか? – Galik

+0

単一の 'std :: vector 'を使い、そのサイズを 'width * height'にしてください。 – Simple

答えて

4

C++では、はありませんmallocを使用してオブジェクト(またはオブジェクトの配列)を割り当てません。 mallocはメモリを割り当てるのが得意ですが、それだけです。それはではありません doはコンストラクタを呼び出しています。つまり、vectorオブジェクトはすべて未初期化です。それらを使用すると、の未定義の動作が発生します。

アレイを動的に割り当てる場合は、new[]を使用する必要があります。または、より良い方法として、std::vectorを使用してください(はい、std::vector<std::vector<double>>は問題ありません)。もし上記のように前に既存のループを使用することができた後

// Create the outer vector containing `dim` elements 
std::vector<std::vector<double>> D(dim); 


あなたが特定のサイズのベクトルを初期化することができvector constructor権利を使用します。

+0

Joachimに感謝します。私が配列と配列を使いたい理由は、サイクルのためであり、0ではなくiでjを開始させます。ベクトルでは、私はそれを行うことはできません。(少なくとも、私は方法はわかりません) –

+0

@DuccioPiovaniコンストラクタについて何も知らなかったとしても、あなたが望むサイズにベクトルを[サイズ変更する](http://en.cppreference.com/w/cpp/container/vector/resize)する方法について説明します。 – PaulMcKenzie

+0

@ Joachim Pileborgこれは非常に便利でした。ちょうど私に多くの時間を節約させました。私はそれに非常に感謝します。 –

関連する問題