C++ STL:使用带有priority_queue的map
我试图通过将字母及其相应的值保存到映射中,然后将映射插入到优先级队列中来实现霍夫曼编码。当我尝试声明我的队列时,出现参数转换错误。我到底应该输入什么作为参数?我这里所拥有的是我最好的猜测。
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;*/
}
我觉得问这个问题有点愚蠢,但彻底的谷歌搜索并没有给我答案。非常感谢您的帮助!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您不能使用映射作为priority_queue的底层容器:priority_queue必须可以自由地对容器中的内容进行重新排序,这对于映射来说是不允许的。只能使用向量和双端队列(来自标准容器)。
因此,容器类型将类似于
vector >
。然后,您需要一个较小/较大的运算,仅考虑该对的第二个字段。You cannot use a map as the underlying container for a priority_queue: the priority_queue must be free to reorder things in the container, which is not allowed for maps. Only vector and deque can be used (from the standard containers).
So, the container type would be something like
vector<pair<char, int> >
. Then, you need a less/greater operation that only takes the second field of the pair into account.方法 1,使用 函子,
方法 2,使用函数和
decltype()
上面例子中的priority_queue是按值排序的,
method 1, using a functor,
method 2, using a function and
decltype()
itthe priority_queue in above example is sorted by value,