2012-04-19 3 views
2

나는 여러 시간 동안이 문제에 갇혀 있었지만, 내가 보지 못하는 사소한 해결책이 있다는 느낌이 들었다. 우선 정의 된 구조체에 대한 포인터의 MinHeap을 생성하기 위해 우선 순위 큐를 사용하려고합니다. 내 문제는 priority_queue 템플릿을 일치시키기 위해이 구조체에 대한 포인터에 대해 연산자를 오버로드해야한다는 것입니다. 이것은 내가 그것을 도랑을 파기로 결정하기 전에 stl priority_queue를 사용하려는 나의 최후의 수단이다. 구조체에 대한 포인터에 대해 연산자를 오버로드하는 방법은 무엇입니까? C++

내 코드의 관련 단편

은 다음과 같다 : (i) 부 구조체 정의 :

typedef struct Node Node; 
struct Node 
{ 
    int frequency; 
    bool operator>(const Node& other) const{ 
     return frequency > other.frequency; 
    } 
}; 

(II)의 우선 순위 큐 초기화 :

priority_queue<Node*,vector<Node*>,greater<Node*> > q; 

그리고 (ⅲ)을 구성하는 루프에 대한 초기 힙 (int_array가 초기화되었다고 가정) :

for (int i = 0; i < SIZEOFINTARRAY; i++) 
{ 
    Node *n = new Node; 
    n->frequency = int_array[i]; 
    q.push(n); 
} 

현재, s "heap"은 FIFO로 반환되고 정렬은 발생하지 않습니다. 이것은 우선 순위 비교가 포인터에서 먼저 검사하고 배열의 요소가 메모리에서 더 아래에 위치하기 때문입니다. 이 일을 성취 할 수있는 방법에 대한 조언을주세요.

추신. 이 게시물이 stackoverflow 표준을 준수하지 않으면 죄송합니다 (규칙을 따르기 위해 최선을 다했지만 첫 번째 게시물입니다). 나는 모든 비평을 환영하므로 나는 결코 다시 같은 실수를 할 수 없다.

+0

거기에 노드를 큐의 값 유형으로 사용할 수없는 이유가 무엇입니까? 또한이 태그는 C++로 태그되었으므로'typedef struct Node Node;는 필요하지 않습니다. 그리고 구조체에 다음을 포함하는 어떤 형식화를 저장하기위한 생성자를 부여하는 것이 좋습니다 – stijn

+0

@stijn 내가 여기에서 빠뜨린 몇몇 Node * 멤버; 이 Node * 멤버는 나중에 큐에서 타입을 만들지 못하게합니다. 나중에 코드에서 본질적으로 대기열을 다시 만들어야하기 때문에 (코드는 허프만 인코딩을 수행합니다) – sebo

+0

스왑을 구현하면 여전히 재구성이 가능해 보입니다. 노드, 안돼? 아니면 성능 문제가 발생합니까? – stijn

답변

3

일반적인 방법은 단지 같은 std::greater을하지만 역 참조하는 deref_greater의 종류를 구현하는 것 먼저 args를 입력하십시오.

template<class T> 
struct deref_greater : public std::binary_function<T, T, bool> 
{ 
    bool operator()(const T& _Left, const T& _Right) const 
    { 
    return *_Left > *_Right; 
    } 
}; 
2

오히려 당신의 노드 클래스에 > 연산자를 오버로드하는 대신 Node* 포인터에 대한 비교를 구현할 수 :

struct NodeGreater 
{ 
    bool operator() (const Node* lhs, const Node* rhs) const 
    { 
     if (lhs == 0 || rhs == 0) 
     { 
      // Perhaps throw an exception here... 
     } 

     return lhs->frequency > rhs->frequency; 
    } 
}; 

priority_queue<Node*,vector<Node*>,NodeGreater> q; 
+0

그것은 매력처럼 작동했습니다. 고맙습니다. 나는 prior_queue에 익숙하지 않은 것 같았고, 클래스에서 사용할 비교기를 작성할 수 있는지 몰랐다. 그 템플릿의 슬롯을 비교했다. 이것은 좋은 학습 경험입니다. – sebo

+0

당신을 진심으로 환영합니다. – Nick

관련 문제