2d вектор классов, как ссылаться - PullRequest
0 голосов
/ 12 ноября 2011

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

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

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

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

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

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

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

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

Ответы [ 2 ]

1 голос
/ 12 ноября 2011

Вы, вероятно, получаете доступ за пределами.Попробуйте ...

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 голосов
/ 12 ноября 2011

Прежде всего, множество указателей кажется действительно опасным. Очень сложно отследить освобождение памяти для всех этих указателей.

Поэтому сначала попытайтесь использовать vector<vector<Intersection> >;, чтобы исключить возможность неверного указателя на структуру пересечения.

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

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

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

...