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);
}
}
내가 무슨 일을하고 있는가인가?
감사
좋아요, 그렇다면 연산자가 const 참조를 취하고 포인터에 하나가 아니라는 것을 이해하고 PQ가 노드에 대한 포인터 대신 노드를 가져가는 것을 이해합니다. 나머지는 어떨까요? 왜 생성자가 값으로 매개 변수를 가져야하는지, 왜 "using namespace std"를 사용하면 안되며 const 나쁜 습관을 없애기 위해 왜 형 변환이 필요한가? – Zach
@ Zach : 매개 변수를 변경하지 않으므로 매개 변수를 전달하는 이유는 무엇입니까? 네가 그렇게했다면 나중에 위험한 던지기가 필요하지 않을 것이다. 그 캐스팅은 왜 위험한가요? 지도 키가 변경되지 않기 때문에; 하나를 변경하면지도가 더 이상 정렬되지 않고 이제는 전체 컨테이너가 손상되었을 수 있습니다. 'using namespace std; '는 네임 스페이스에 물건을 넣는 모든 목적을 처음부터 실패합니다. 과부하 해결, 이름 충돌 등으로 인해 미묘한 버그에 대한 모든 종류의 기회를 도입했습니다. –