2009-10-09 8 views
13

우선 순위 큐를 정렬하는 데 필요한 매개 변수를 인식하는 데 많은 문제가 있습니다. 내 사용자 정의 클래스에서 연산자보다 작게 오버로드되었지만 사용하지 않는 것 같습니다. 여기에 관련 코드입니다 :STL 우선 순위 대기열 사용자 지정 클래스

Node.h

class Node 
{ 
public: 
    Node(...); 
    ~Node(); 
    bool operator<(Node &aNode); 
... 
} 

Node.cpp

#include "Node.h" 
bool Node::operator<(Node &aNode) 
{ 
    return (this->getTotalCost() < aNode.getTotalCost()); 
} 

getTotalCost은() int로

MAIN.CPP

priority_queue<Node*, vector<Node*>,less<vector<Node*>::value_type> > nodesToCheck; 

반환 무엇 내가 누락 및/또는 잘못하고 있습니까?

+0

당신은 차이의 AI에 있어야합니다 클래스 :) http://stackoverflow.com/questions/1517854/priorityqueue-comparison-for-pointers – Polaris878

+0

좋은 탐정 기술;) – bmalicoat

답변

21

less<vector<Node*>::value_type> 당신의 비교기는 서로을 포인터를 비교하는 수단, 당신의 벡터를 의미하는 것은 메모리 레이아웃에 의해 정렬됩니다 노드의

는이 같은 것을하고 싶지 : 당신이 totalCost의 당신의 정의에 const를-정확해야

#include <functional> 
struct DereferenceCompareNode : public std::binary_function<Node*, Node*, bool> 
{ 
    bool operator()(const Node* lhs, const Node* rhs) const 
    { 
     return lhs->getTotalCost() < rhs->getTotalCost(); 
    } 
}; 

// later... 
priority_queue<Node*, vector<Node*>, DereferenceCompareNode> nodesToCheck; 

참고.

편집 : 이제이 C++ (11)는 여기에, 당신은 (당신이 기능 #include를 할 필요가 없습니다 의미) 더 이상 표준 :하며 binary_function에서 상속 할 필요가 없습니다

+1

호기심에서 벗어난 이유 : 왜 함수가 아닌 operator()로 구조체를 정의해야합니까? –

+3

해야합니다. 템플릿을 함수, 유형만으로 전문화 할 수는 없습니다 (특정 상황 제외). 함수 객체는 STL 프로그래밍의 매우 중요한 부분입니다. 위대한 책은 Scott Meyer의 Effective STL *입니다.그것은 STL과 그것을 이용하는 최상의 방법에 관한 모든 것을 설명합니다. – rlbond

+0

또한'std :: less '도 함수 객체 (즉,'operator()'가있는 구조체) – rlbond

14

매개 변수를 const으로 지정해야합니다. 지금은 비용이 아닌 참조를 제공하기 때문에 비교중인 개체를 수정할 수 있습니다. (당신은 아니고 아마 안됩니다).

너는 const-correct가 아니다. 그 후

bool operator<(const Node &aNode) const; 

당신은 문제가 getTotalCost() 함수를 호출이있는 경우,뿐만 아니라에서 const되지 않은 가능성이 높습니다 : 함수가 const를해야한다 귀하의 operator<는 노드를 수정하지 않습니다. 아직 const가 아닌 경우 const로 표시하십시오.

int getTotalCost(void) const; 

코드가 더 const-correct되었습니다. 보조 노트에

는 이항 연산자는 일반적으로 클래스 외부 구현 :

class Node 
{ 
public: 
    // ... 

    int getTotalCost(void) const; 

    // ... 
}; 

bool operator<(const Node& lhs, const Node& rhs) 
{ 
    return lhs.getTotalCost() < rhs.getTotalCost(); 
} 
+1

+1 : 최소한의 인터페이스는 좋은 것입니다 –

+0

사실, 나는 정의에 동의해야합니다. 어떤 경우에는 클래스 밖에서''연산자 <'. 그것이해야 할 일이 무엇인지 분명히한다면, 회원으로 정의하는 것이 큰 의미가 없다고 생각합니다. 또한 Boost.Operators를 사용할 수 있습니다. – rlbond