Bob*_*bby 4 c++ stl priority-queue map huffman-code
我试图通过将字母及其相应的值保存到地图然后将地图插入优先级队列来实现霍夫曼编码.我尝试声明队列时收到参数转换错误.究竟我应该把它作为参数?我在这里是我最好的猜测.
void main()
{
ifstream doc("doc.txt");
map<char, int> C;
char letter;
while(!doc.eof()){
doc.get(letter);
if(letter >= 'a' && letter <= 'z')
C[letter]++;
}
priority_queue<int, map<char,int>, greater<int> > Q(C); //also tried greater<map<char,int>>
/*map<char, int>::const_iterator it;
for(it = C.begin(); it != C.end(); it++)
cout<<it->first<<" "<<it->second<<endl;*/
}
Run Code Online (Sandbox Code Playgroud)
我觉得有点愚蠢的问这个,但彻底的谷歌搜索并没有得到答案.非常感谢您的帮助!
Mar*_*wis 10
您不能使用map作为priority_queue的基础容器:priority_queue必须可以自由地重新排序容器中的内容,这是映射不允许的.只能使用vector和deque(来自标准容器).
所以,容器类型会是这样的vector<pair<char, int> >.然后,您需要一个更小/更大的操作,只考虑该对的第二个字段.
方法1,使用函子,
#include <unordered_map>
#include <vector>
#include <iostream>
#include <queue>
using namespace std;
typedef pair<char, int> PAIR;
int main(int argc, char *argv[]) {
unordered_map<char, int> dict = {{'a', 12}, {'b', 9}, {'c', 7}, {'d', 10},};
struct cmp {
bool operator()(const PAIR &a, const PAIR &b) {
return a.second < b.second;
};
};
priority_queue<PAIR, vector<PAIR>, cmp> pq(dict.begin(), dict.end());
while (!pq.empty()) {
PAIR top = pq.top();
cout << top.first << " - " << top.second << endl;
pq.pop();
}
}
Run Code Online (Sandbox Code Playgroud)
方法2中,使用函数和decltype()它
auto cmp = [](const PAIR &a, const PAIR &b) {
return a.second < b.second;
};
priority_queue<PAIR, vector<PAIR>, decltype(cmp)> pq(
dict.begin(), dict.end(), cmp);
Run Code Online (Sandbox Code Playgroud)
上例中的priority_queue按值排序,
a - 12
d - 10
b - 9
c - 7
Run Code Online (Sandbox Code Playgroud)