2011-11-12 13 views
0

と仮定私が持っている:2Dベクターは、どのように参照するために

vector<vector<Intersection *> > vvin ; 
vector<vector<Intersection *> >::iterator vvit ; 

そして、私はそのようにアクセスしています:

class Intersection { 
public: 
int street; 
int avenue; 
double x; 
double y; 
double green[2]; // Light green times for STREET & AVENUE 
list <class Road_Segment *> adj; 
double best_time; 
class Road_Segment *backedge; 
multimap <double, Intersection *>::iterator bfsq_ptr; 
}; 

そして、私の主な機能には、私はの2Dベクトルを持っている

for (lit = City_Map::all.begin() ; lit != City_Map::all.end() ; lit++) { 

inter = *lit ; 
s = inter->street ; 
a = inter->avenue ; 
vvin[s][a] = inter ; 
} 

ここで、litはすべてのクラスを含むリストイテレータです。私は難易度を持っています。これは整数インデックスを使って2dベクトルにアクセスしています。プログラムはその正確な行にセグメンテーションしています。なぜどんなアイデア?また

、でも

cout << vvin[i][j] << endl ; // or for that matter[0][0] or [1][1] or whatever 

セグメンテーション違反ので、私はそれがポインタ代入ではありません知っています。

整数インデックスを使ってアクセスできない場合は、同じ方法でイテレータを使用する方法があるので、2次元配列のようにアクセスできますか?

お願いしてありがとうございます。

+3

あなたのベクターはおそらく空であり、範囲外のデータにアクセスしています。 – Pubby

+0

nah、vvin.resize(100)を実行してもsegfaultedしました。 .push_back(inter)を使用する必要があります。私が望んでいたものではない。 – FatAdama

+2

両方のディメンションのサイズを変更しましたか? – Pubby

答えて

1

おそらく範囲外にアクセスしている可能性があります。試してみてください...

または、いくつかのブレークポイントを設定し、そのようにベクトルを検査してください。

0

まず第一に、多くのポインタは本当に危険です。これらすべてのポインタのメモリ割り当て解除を追跡するのは非常に難しいです。

したがって、最初にvector<vector<Intersection> >;を使用して、交差構造への無効なポインタの可能性を削除してみます。

バグが修正されていない場合、あなたは2つのインデックスで対処するための要素を持っていることを確認するために、この簡単なテストをしてみてください:

vector<vector<Intersection> > vvin; 
vvin.push_back(vector<Intersection>()); 
vvin.back().push_back(Intersection()); 
cout << vvin[0][0] << endl; 

このコードが正常に動作する場合(!それが正常に動作しなければならない)、それはですあなたが2つのインデックスで対処しようとする要素を作成しないことは明らかです。

関連する問題