это мой первый вопрос, поэтому я прошу прощения за возможные формальные ошибки, которые вы можете найти в моем посте.
Я пишу простой класс для «Ненаправленных связанных взвешенных графов», который должен использовать списки смежности, основанные на векторах.
Проблема в том, что когда я запускаю программу из Eclipse, MS Windows говорит, что она «перестает работать», и после отладки я получаю сообщение «Необработанное исключение в 0x00AE251A …. Место записи нарушения доступа …».
Оглядываясь вокруг, я обнаружил, что эта проблема может быть вызвана отсутствием уничтожения указателя или инициализацией указателя (?). Я переключился со стандартного указателя на shared_ptr для устранения этой проблемы, но ошибка та же …
Кто-нибудь может просветить меня об этом? Я потерял почти весь день, пытаясь найти причину без успеха.
class UndirectedGraph
{
private:
int V;
std::vector<std::shared_ptr<std::pair<int,int>>>* adj;
public:
UndirectedGraph(int V)
{
this->V = V;
this->adj = new std::vector<std::shared_ptr<std::pair<int,int>>>;
}
void addEdge(int v, int w, int weight)
{
auto sp = std::make_shared<std::pair<int,int>>(std::make_pair(v,weight));
adj[v].push_back(sp);
}
int main()
{
UndirectedGraph G1(7);//Ok
G1.addEdge(0,1,9);//Ok
G1.addEdge(1,2,5);//Ok
G1.addEdge(2,0,8);//EXCEPTION RAISED HERE (if line is commented all run fine)
return 0;
}
Я заметил пару ошибок в коде:
Если вам нужны списки смежности, то this->adj
должен быть вектором векторов. В настоящее время это просто 1-D вектор <int,int>
пар. Вместо этого должно быть:
std::vector<std::vector<std::shared_ptr<std::pair<int,int>>>>* adj;
В конструкторе this-> adj должен быть инициализирован следующим образом:
this->adj = new std::vector<std::vector<std::shared_ptr<std::pair<int,int>>>>(V);
Теперь в функции addEdge вам нужно сначала получить доступ к вектору, соответствующему узлу ‘v’, а затем в этот вектор вам нужно вставить пару (w, weight) [НОТА что, даже если мы игнорируем ошибку, что есть только вектор, логика по-прежнему неверна, так как вы нажимаете (v, вес) вместо (вес, вес) в этот вектор. Модифицированная функция addEdge будет выглядеть примерно так:
void addEdge(int v, int w, int weight)
{
auto adjacencyList = adj->at(v);
auto sp = std::make_shared<std::pair<int,int>>(std::make_pair(w,weight));
adjacencyList.push_back(sp);
}
Надеюсь, это поможет вам