2010-11-26 17 views
1

을 정렬되지 않습니다 :C++, 우선 순위 큐는 항목 내가 우선 순위 큐에 문제가

std::priority_queue <NodePrio, std::vector<NodePrio>, sortNodesByPrio> PQ; 

struct NodePrio 
{ 
Node *node; 
double priority; 

NodePrio() : node(NULL), priority(0) {} 
NodePrio(Node *node_, double priority_) : node(node_), priority(priority_) {} 
}; 

class sortNodesByPrio 
{ 
public: 
    bool operator() (const NodePrio &n1, const NodePrio &n2) const; 
} 


bool sortNodesByPrio::operator() (const NodePrio &n1, const NodePrio &n2) const 
{ 
return n1.priority < n2.priority; 
} 

반복적으로 새로운 요소를 누른 후를

PQ.push(NodePrio(node, distance)); 

그들이 (우는 소리 참조)으로 정렬되지 않습니다 어떤 시점에서 617,451,515,... 난

Step1: 
push (node, 55.33); 

PQ: 
[0] 55.33 

Step2: 
push (node, 105.91); 

PQ: 
[0] 105.91 
[1] 55.33 

Step 3: 
push (node, 45.18); 

PQ: 
[0] 105.91 
[1] 55.33 
[2] 45.18 

Step 4: 
push (node, 70.44); 

PQ: 
[0] 105.91 
[1] 70.44 
[2] 45.18 
[3] 55.33 //Bad sort 
+0

"그들은 분류되지 않았습니까?" 입력하는 샘플 데이터와 우선 순위 큐에서 모든 데이터를 팝했을 때의 결과를 게시 할 수 있습니까? –

+0

입력의 한 두 가지 예를 들어 줄 수 있습니까? 그리고 결과로 나오는 큐의 내용은 무엇입니까? 또한, 지금까지 디버깅 방법으로 무엇을 시도 했습니까? – suszterpatt

답변

0

변화 시도 ... 코드, 비교기 코드가 반복적으로 수행 된 디버깅하려고

return n1.priority() < n2.priority(); 

"샘플 결과"를 바탕으로

return n1.priority < n2.priority; 
+1

바보 같은 질문 : 변수에 adding()는 무엇을합니까? –

+0

@Markus : 그러면 함수 호출이됩니다. 'priority'가 인자를 취하지 않는 함수로 불릴 수있는 어떤 타입의 것이면 유효하지만,'double'이기 때문에'()'를 추가하면 코드가 부적절하게됩니다. 내 생각에 OP는 정확한 코드를 복사하여 붙여 넣지 않았다. 다른 구문 오류가 있습니다. –

+0

@Rohit : 죄송합니다. 코드를 게시하는 것이 저의 실수였습니다 .... 원본 소스 코드가 정확합니다. – Ian

7

에 당신이 보여, 당신이 우선 순위 큐가 무엇인지 이해하지 못하는 것 같습니다.

우선 순위 큐를 사용하면 (top()pop()을 사용하여) 요소를 제거 할 때 요소가 우선 순위에 따라 제거됩니다. 요소는 우선 순위에 저장되지 않고 힙에 저장됩니다.

우선 순위 큐가 요소를 저장하는 방법에 대한 자세한 정보는 좋아하는 알고리즘 서적이나 웹 사이트를 참조하십시오.

+0

설명해 주셔서 감사합니다. 이제는 분명합니다. 모든 요소가지도에서 정렬 된 것처럼 생각했지만 키 중복이 허용됩니다. – Ian

+0

당신은'std :: multimap'을 원할 것입니다. – suszterpatt

+0

@suszterpatt. 나는 전혀 생각하지 않는다. PQ가 작동하는 방식을 알고 있었지만 항목의 내부 저장에 대해 완전히 잘못되었습니다. – Ian