类的2d传染媒介,如何参考

时间:2011-11-12 03:00:24

标签: c++ algorithm vector iterator segmentation-fault

假设我有:

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,所以我知道它不是指针赋值。

如果我无法通过整数索引访问它,有没有办法以相同的方式使用迭代器,所以我可以像二维数组一样访问它?

请和谢谢。

2 个答案:

答案 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个索引来解决的元素。