【问题标题】:Create priority_queue using struct and map使用 struct 和 map 创建 priority_queue
【发布时间】: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 下一个方式:

  1. 为来自freqs 的每一对创建新节点
  2. 从所有这些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
}

【问题讨论】:

    标签: c++ priority-queue


    【解决方案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 方法,但仍然不起作用:(
    • 太棒了!有用!我已经投票给你的答案了!但是我还有一个问题-不知道可以在这里再问一次...请看我对问题的补充。
    • 哦,看来这是错字了 :)
    猜你喜欢
    • 1970-01-01
    • 2022-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-27
    • 2018-11-16
    • 2017-07-28
    相关资源
    最近更新 更多