【问题标题】:2d Vector Of Classes, How To Reference类的 2d 向量,如何参考
【发布时间】:2011-11-12 03:00:23
【问题描述】:

假设我有:

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

segfaults,所以我知道这不是指针分配。

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

请,谢谢。

【问题讨论】:

  • 您的向量可能是空的,因此您访问的数据越界。
  • 不,做了 vvin.resize(100) 并且仍然有段错误。必须使用 .push_back(inter)。不是我想要的。
  • 你调整了两个维度的大小吗?

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


【解决方案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';
}

或者设置一些断点并以这种方式检查向量。

【讨论】:

    【解决方案2】:

    首先,大量的指针似乎真的很危险。跟踪所有这些指针的内存释放非常困难。

    所以首先尝试使用vector&lt;vector&lt;Intersection&gt; &gt;; 来消除指向Intersection 结构的无效指针的可能性。

    如果错误未修复,请尝试这个简单的测试以确保您有一个元素可以通过 2 个索引来寻址:

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

    如果这段代码正常工作(它必须正常工作!),很明显你没有创建一个你试图通过 2 个索引来寻址的元素。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-25
      • 1970-01-01
      • 2013-03-31
      相关资源
      最近更新 更多