假设我有:
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矢量:
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 ;
}
where lit是包含所有类的列表迭代器。我有难度通过整数索引访问2d向量,我知道我以前做过的事情。该程序是在该确切的行上进行segfaulting。有什么想法吗?
此外,甚至
cout << vvin[i][j] << endl ; // or for that matter[0][0] or [1][1] or whatever
segfaults,所以我知道它不是指针赋值。
如果我无法通过整数索引访问它,有没有办法以相同的方式使用迭代器,所以我可以像二维数组一样访问它?
请和谢谢。
答案 0 :(得分: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';
}
或设置一些断点并以这种方式检查向量。
答案 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个索引来解决的元素。