簡體   English   中英

優先隊列未排序

[英]Priority Queue Not Sorting

我正在嘗試實現自己的霍夫曼編碼算法,因此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);
 }

}

我究竟做錯了什么?

謝謝

您將指針存儲在priority_queue ,因此這些元素按指針值排序,而不使用operator<重載。

您要么需要將Node對象存儲在優先級隊列中,要么需要為優先級隊列編寫一個自定義比較函數,以取消對存儲的指針的引用並比較它們所指向的Node對象。

由於您詢問“我在做什么錯?”,因此這里有一些其他建議:

  • 您的operator<重載應采用const引用,而不是對指針的引用。
  • 您的Node構造函數應按值或至少按const引用獲取其參數。 強制轉換(char&)it->first不好。 const幫助您編寫好的代碼,不要與之抗爭。
  • 您可能應該將Node對象直接存儲在優先級隊列中,而不是指針中。
  • 您正在某處using namespace std 您應該刪除此代碼並在需要的地方拼出std::

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM