使用 struct 和 map 创建 priority_queue
Posted
技术标签:
【中文标题】使用 struct 和 map 创建 priority_queue【英文标题】:Create priority_queue using struct and map 【发布时间】:2019-12-04 23:01:43 【问题描述】:我有结构:
struct Node
unsigned char symbol;
unsigned int freq;
Node* left;
Node* right;
Node(unsigned char _byte, int _freq)
: symbol(_byte), freq(_freq), left(nullptr), right(nullptr) ;
;
并且已经创建了这样的unordered_map
:
std::unordered_map<unsigned char, uint> freqs ='a',12, 'b',122;
我想做的 - 是创建priority_queue
下一个方式:
-
为来自
freqs
的每一对创建新节点
从所有这些Node
s 创建priority_queue
。
到目前为止我尝试了什么: 从地图创建向量并尝试创建priority_queue:
bool nodeCompare(const Node* first, const Node* second)
return first->freq > second->freq;
typedef std::priority_queue<Node*,
std::vector<Node*>,
nodeCompare()> my_queue;
std::vector<Node*> node_vect;
std::unordered_map<byte, uint>::iterator it;
for (it = freqs.begin(); it != freqs.end(); ++it)
Node* new_node = new Node(it->first, it->second);
node_vect.push_back(new_node);
my_queue(node_vect.begin(), node_vect.end(), nodeCompare);
但这不起作用:typedef
构造中的错误:
函数“nodeCompare”不是类型名称
其他问题: 如果我以这种方式创建我的向量,也许有一些方法可以将节点推送到 my_queue 而不创建额外的向量?
my_queue q;
std::vector<Node*> node_vect;
std::unordered_map<byte, uint>::iterator it;
for (it = freqs.begin(); it != freqs.end(); ++it)
Node* new_node = new Node(it->first, it->second);
node_vect.push_back(new_node);
//q.push(new_node); this doesn't work
【问题讨论】:
【参考方案1】:priority_queue 模板参数不是函数而是对象类型
template <class T, class Container = vector<T>,
class Compare = less<typename Container::value_type> > class priority_queue;
所以只需将该函数包装到一个结构/类(Functor)中就可以了。
struct Comparator
bool operator()(const Node* first, const Node* second) const
return first->freq > second->freq;
;
typedef std::priority_queue<Node*,
std::vector<Node*>,
Comparator> my_queue;
如果你想在 Node 结构中使用 Comparator,只需创建一个内部结构
struct Node
unsigned char symbol;
unsigned int freq;
Node* left;
Node* right;
Node(unsigned char _byte, int _freq)
: symbol(_byte), freq(_freq), left(nullptr), right(nullptr) ;
struct Comparator
bool operator()(const Node* first, const Node* second) const
return first->freq > second->freq;
;
;
typedef std::priority_queue<Node*,
std::vector<Node*>,
Node::Comparator> my_queue;
my_queue queue(node_vect.begin(), node_vect.end());
【讨论】:
我可以将Comparator
添加到我的Node
结构中吗?并在 typedef 中使用它?或者我需要创建一个新的?
是的,没有问题
你能给出这个例子吗?我不知道如何添加 - 尝试作为 struct 方法,但仍然不起作用:(
太棒了!有用!我已经投票给你的答案了!但是我还有一个问题-不知道可以在这里再问一次...请看我对问题的补充。
哦,看来这是错字了 :)以上是关于使用 struct 和 map 创建 priority_queue的主要内容,如果未能解决你的问题,请参考以下文章