2d вектор классов, как ссылаться

#c #algorithm #vector #iterator #segmentation-fault

#c #алгоритм #вектор #итератор #ошибка сегментации #c

Вопрос:

Предположим, у меня есть :

 class Intersection {
 public:
 int street;
 int avenue;
 double x;
 double y;
 double green[2];    // Light green times for STREET amp; 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 ; 
}
  

Где lit — это итератор списка, содержащий все классы. У меня возникли трудности с доступом к 2d-вектору через целочисленный индекс, что, как я знаю, я делал в прошлом. Программа выполняет сегментацию именно на этой строке. Есть какие-нибудь идеи, почему?

Кроме того, даже

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

segfaults, так что я знаю, что это не присвоение указателя.

Если я не могу получить к нему доступ через целочисленный индекс, есть ли способ использовать итераторы таким же образом, чтобы я мог получить к нему доступ как к 2d массиву?

Пожалуйста и спасибо.

Комментарии:

1. Ваши векторы, вероятно, пусты, и поэтому вы получаете доступ к данным, выходящим за рамки.

2. нет, сделал vvin.resize (100) и все равно произошел сбой. Приходится использовать .push_back (между). Не то, что я хотел.

3. Вы изменили размер обоих измерений?

Ответ №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<vector<Intersection> >; , чтобы исключить возможность недопустимого указателя на структуру пересечения.

Если ошибка не исправлена, попробуйте этот простой тест, чтобы убедиться, что у вас есть элемент для адреса по двум индексам:

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

Если этот код работает нормально (он должен работать нормально!), Очевидно, что вы не создаете элемент, к которому пытаетесь обратиться с помощью двух индексов.