使用 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 的每一对创建新节点 从所有这些Nodes 创建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的主要内容,如果未能解决你的问题,请参考以下文章

[]map[string]struct 的 Golang 赋值错误

go 实现struct转map

Go struct和map转化为JSON串

Go struct和map转化为JSON串

Go struct和map转化为JSON串

gorm Update方法