クラスの2次元ベクトル、参照方法

私が持っていると仮定:

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

そして、私の主な機能には、次の2次元ベクトルがあります。

vector > vvin ; 
vector >::iterator vvit ; 

私はそれにアクセスしています:

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は、すべてのクラスを含むリストイテレータです。整数インデックスを使って2次元ベクトルにアクセスするのは難しいですが、これは過去に行ったことです。プログラムはその正確な行にセグメンテーションしています。なぜどんなアイデア?

また、

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

segfaults、私はそれがポインタの割り当てではないことを知っている。

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

どうかありがとう。

0
あなたのベクトルはおそらく空であり、範囲外のデータにアクセスしています。
追加された 著者 Pubby,
両方のディメンションのサイズを変更しましたか?
追加された 著者 Pubby,
nah、vvin.resize(100)を行い、それでもなおsegfaulted。 .push_back(inter)を使用する必要があります。私が望んでいたものではない。
追加された 著者 FatAdama,

2 答え

あなたはおそらく範囲外にアクセスしています。試してみて...

std::cout << "vvin.size() = " << vvin.size() << '\n';
for( size_t i = 0; i < vvin.size(); ++i )
{
    std::cout << "vvin[" << i << "].size() = " << vvin[i].size() << '\n';
}

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

1
追加された

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

So at first try to use vector >; to remove the possibility of an invalid pointer to the Intersection structure.

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

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

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

0
追加された