2011-11-12 72 views
0

假設我有:2D矢量類,如何引用

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; 
}; 

而在我的主要功能我有一個二維向量:

vector<vector<Intersection *> > vvin ; 
vector<vector<Intersection *> >::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是包含所有類的列表迭代器。我有難度通過整數索引訪問2d矢量,我知道我已經在過去完成了某些操作。該計劃在該確切的路線上進行了細分。任何想法爲什麼?

而且,即使

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

段錯誤,所以我知道這是不是指針賦值。

如果我無法通過整數索引訪問它,有沒有辦法以相同的方式使用迭代器,所以我可以像2d數組一樣訪問它?

請和謝謝。

+3

你的載體可能是空的,所以你正在訪問越界數據。 – Pubby

+0

沒有,做了vvin.resize(100),仍然segfaulted。必須使用.push_back(inter)。不是我想要的。 – FatAdama

+2

你調整了兩個維度嗎? – Pubby

回答

1

您可能訪問的是越界。嘗試...

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'; 
} 

或者設置一些斷點並檢查向量的方式。

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個索引解決的元素。