나는 여러 시간 동안이 문제에 갇혀 있었지만, 내가 보지 못하는 사소한 해결책이 있다는 느낌이 들었다. 우선 정의 된 구조체에 대한 포인터의 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 표준을 준수하지 않으면 죄송합니다 (규칙을 따르기 위해 최선을 다했지만 첫 번째 게시물입니다). 나는 모든 비평을 환영하므로 나는 결코 다시 같은 실수를 할 수 없다.
거기에 노드를 큐의 값 유형으로 사용할 수없는 이유가 무엇입니까? 또한이 태그는 C++로 태그되었으므로'typedef struct Node Node;는 필요하지 않습니다. 그리고 구조체에 다음을 포함하는 어떤 형식화를 저장하기위한 생성자를 부여하는 것이 좋습니다 – stijn
@stijn 내가 여기에서 빠뜨린 몇몇 Node * 멤버; 이 Node * 멤버는 나중에 큐에서 타입을 만들지 못하게합니다. 나중에 코드에서 본질적으로 대기열을 다시 만들어야하기 때문에 (코드는 허프만 인코딩을 수행합니다) – sebo
스왑을 구현하면 여전히 재구성이 가능해 보입니다. 노드, 안돼? 아니면 성능 문제가 발생합니까? – stijn