C++ 使用struct和map创建优先级队列
我有一个结构:C++ 使用struct和map创建优先级队列,c++,priority-queue,C++,Priority Queue,我有一个结构: 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) {}; }; 并且已经创建了这样的无序地图: std::unorder
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) {};
};
并且已经创建了这样的无序地图:
std::unordered_map<unsigned char, uint> freqs ={{'a',12}, {'b',122}};
但这不起作用:typedef
构造中出现错误:
函数“nodeCompare”不是类型名
附加问题:
如果我以这种方式创建向量,也许有某种方法可以在不创建额外向量的情况下将节点推送到我的_队列中
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
}
myu队列q;
std::vector node\u vect;
std::无序的_映射::对其进行迭代器;
for(it=freqs.begin();it!=freqs.end();+it)
{
Node*new_Node=新节点(it->first,it->second);
节点向量推回(新节点);
//q、 推送(新节点);这不起作用
}
优先级\u队列模板参数不需要函数,而是对象类型
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;
结构比较器
{
布尔运算符()(常数节点*第一个,常数节点*第二个)常数{
返回第一->频率>第二->频率;
}
};
typedef std::priority_queue my_queue;
如果您希望比较器位于节点结构内部,只需创建一个内部结构
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());
struct节点{
无符号字符符号;
无符号整数频率;
节点*左;
节点*右;
节点(无符号字符字节,整数频率)
:符号(_字节)、频率(_频率)、左(空ptr)、右(空ptr){};
结构比较器
{
布尔运算符()(常数节点*第一个,常数节点*第二个)常数{
返回第一->频率>第二->频率;
}
};
};
typedef std::priority_queue my_queue;
我的队列队列(node_vect.begin(),node_vect.end());
优先级\u队列模板参数不需要函数,而是对象类型
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;
结构比较器
{
布尔运算符()(常数节点*第一个,常数节点*第二个)常数{
返回第一->频率>第二->频率;
}
};
typedef std::priority_queue my_queue;
如果您希望比较器位于节点结构内部,只需创建一个内部结构
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());
struct节点{
无符号字符符号;
无符号整数频率;
节点*左;
节点*右;
节点(无符号字符字节,整数频率)
:符号(_字节)、频率(_频率)、左(空ptr)、右(空ptr){};
结构比较器
{
布尔运算符()(常数节点*第一个,常数节点*第二个)常数{
返回第一->频率>第二->频率;
}
};
};
typedef std::priority_queue my_queue;
我的队列队列(node_vect.begin(),node_vect.end());
我可以将比较器
添加到我的节点
结构中吗?在typedef中使用它?或者我需要创建一个新的?是的,没有问题,你能展示一下这个例子吗?我不知道如何添加-尝试了结构方法,但仍然不起作用:(太棒了!它起作用了!我已经投票给了你的答案!但我还有一个问题-我不知道在这里再问一次是否可以…请看我对问题的添加。哦,看起来这是输入错误:)我可以将比较器添加到节点结构中吗?在typedef中使用它?或者我需要创建一个新的?是的,没有问题,你能展示一下这个例子吗?我不知道如何添加-尝试了struct方法,但仍然不起作用:(太棒了!它起作用了!我已经投了你的票!但我还有一个问题-不知道在这里再问一次是否可以…请看我添加到问题中的内容。哦,看起来这是打字错误:)