#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;
Если этот код работает нормально (он должен работать нормально!), Очевидно, что вы не создаете элемент, к которому пытаетесь обратиться с помощью двух индексов.