2010-08-05 2 views
1

내 자신의 허프만 코딩 알고리즘을 구현 하려다가 C++ STL의 우선 순위 대기열이 올바르게 작동하지 않는 것 같습니다. 문자열에서 문자를 가져 와서 문자열의 빈도 순서에 따라 우선 순위 대기열에 삽입하고 있습니다. 코드는 오류없이 컴파일되고 실행됩니다. 유일한 것은 트리가 올바르게 정렬되지 않는 것 같습니다. 여기 코드는우선 순위 대기열 정렬 안 함

class Node { 
public: 
    int freq; 
    char data; 
    Node(int &f, char &d) { freq=f; data=d; } 
    bool operator<(const Node* &n) const { return n->freq < this->freq; } 
}; 

void Init(priority_queue<Node*> &tree, string input) { 
map<char,int> probability; 
for(int i=0 ; i<input.size() ; i++) { 
    probability[input[i]]++; 
} 
map<char,int>::iterator it = probability.begin(); 
for(it ; it != probability.end() ; it++) { 
    Node* blah = new Node(it->second, (char&) it->first); 
    tree.push(blah); 
} 

}

내가 무슨 일을하고 있는가인가?

감사

답변

8

당신은 priority_queue에 포인터를 저장하는, 그래서 요소는 당신의 operator< 오버로드를 사용하지 않는 포인터 값으로 분류되어 있습니다.

우선 순위 큐에 Node 개체를 저장하거나 우선 순위 큐에 대해 사용자 지정 비교 함수를 작성하여 저장된 포인터를 역 참조하고 해당 포인터가 가리키는 Node 개체를 비교해야합니다.

물어 때문에

는 여기에 몇 가지 다른 제안을하는 "무엇을 내가? 잘못하고있는 중이 야"

  • 귀하의 operator< 과부하는 const를 참조하지 포인터에 대한 참조를해야합니다.
  • Node 생성자는 매개 변수를 값으로 사용하거나 최소한 const 참조로 사용해야합니다. 캐스트 (char&)it->first은 좋지 않습니다. const 당신이 좋은 코드를 작성하는데 도움을주고, 그것에 대항하여 싸우지 마십시오.
  • Node 개체는 포인터가 아닌 우선 순위 큐에 직접 저장해야합니다.
  • 어딘가에 using namespace std을 사용하고 있습니다. 이것을 제거하고 필요할 때마다 std::을 철자해야합니다.
+0

좋아요, 그렇다면 연산자가 const 참조를 취하고 포인터에 하나가 아니라는 것을 이해하고 PQ가 노드에 대한 포인터 대신 노드를 가져가는 것을 이해합니다. 나머지는 어떨까요? 왜 생성자가 값으로 매개 변수를 가져야하는지, 왜 "using namespace std"를 사용하면 안되며 const 나쁜 습관을 없애기 위해 왜 형 변환이 필요한가? – Zach

+1

@ Zach : 매개 변수를 변경하지 않으므로 매개 변수를 전달하는 이유는 무엇입니까? 네가 그렇게했다면 나중에 위험한 던지기가 필요하지 않을 것이다. 그 캐스팅은 왜 위험한가요? 지도 키가 변경되지 않기 때문에; 하나를 변경하면지도가 더 이상 정렬되지 않고 이제는 전체 컨테이너가 손상되었을 수 있습니다. 'using namespace std; '는 네임 스페이스에 물건을 넣는 모든 목적을 처음부터 실패합니다. 과부하 해결, 이름 충돌 등으로 인해 미묘한 버그에 대한 모든 종류의 기회를 도입했습니다. –