2013-12-18 2 views
0
class Edge; 

class Node 
{ 
     public: 
     Node(): distance(numeric_limits<double>::infinity()), visited(false) {} 
     Node(string a_id): distance(numeric_limits<double>::infinity()), visited(false), id(a_id) {} 
     bool operator==(const Node& p) {return p.id == id; } 


     string id; 
     double distance; 
     bool visited; 
     string previous; 
     vector<Edge*> edges; 
}; 

class Edge 
{ 
    public: 
     Edge(double weight, string id) 
     { 
      this->weight = weight; 
      dest = new Node(id); 
     } 
     double weight; 
     Node * dest; 

}; 
class Comparator { 
public: 
    bool operator()(const Node* a, const Node* b) 
    { 
     return (a->distance > b->distance); 
    } 
}; 

Это мои занятия. Я создал приоритетную очередь из вектора указателей узлов:Приоритет Очередь указателей C++

priority_queue<Node*, vector<Node*>, Comparator > queue; 

Но после некоторых операций я получаю ошибку сегментации.

queue.push(nodes[0]); 
queue.pop(); 
queue.push(nodes[1]); 
queue.push(nodes[4]); 


queue.pop(); 
queue.push(nodes[3]); 
queue.push(nodes[5]); 

queue.pop(); 
queue.push(nodes[6]); 
queue.push(nodes[7]); 
nodes[6]->distance=1; 
queue.pop(); 

В последней строке

 queue.pop(); 

Я получаю ошибку сегментации, и я не понимаю, почему это происходит. Заранее спасибо.

+3

Вы не должны мутировать содержимое очереди приоритетов. Специально не что-либо, что связано с определением относительного приоритета между элементами. Другими словами, не делайте этого: 'nodes [6] -> distance = 1;' – juanchopanza

+0

Ошибка сегментации - это обычно повреждение памяти, и это может случиться далеко от точки, где вы получаете ошибку. Ваш код может быть неправильным в другом месте. –

+0

Кто очищает Node.edges? – JimR

ответ

0

Я добавил

#include <limits> 
#include <queue> 
#include <string> 
#include <vector> 
using namespace std; 

в верхней части файла и используются следующие основные():

int main(int argc, char* argv[]) 
{ 
    priority_queue<Node*, vector<Node*>, Comparator > queue; 
    vector<Node> vnode(10); 
    vector<Node*> nodes(10); 
    for (int i = 0; i < 10; ++i) 
    { 
     vnode[i].distance = i; 
     nodes[i] = &vnode[i]; 
    } 

    queue.push(nodes[0]); 
    queue.pop(); 
    queue.push(nodes[1]); 
    queue.push(nodes[4]); 


    queue.pop(); 
    queue.push(nodes[3]); 
    queue.push(nodes[5]); 

    queue.pop(); 
    queue.push(nodes[6]); 
    queue.push(nodes[7]); 
    nodes[6]->distance=1; 
    queue.pop(); 
} 

Он собирает и работает без Segfault, поэтому я предполагаю, что ваши узлы Арен Все ли инициализировано? Кроме того, строка nodes[6]->distance=1; не вызывала узел 6 до pop(); он по-прежнему вставил узел 4 там, но затем переупорядочил остальную часть очереди с узлом 6 сначала, затем 5, затем 7.

Смежные вопросы