使用结构和映射创建 priority_queue
Create priority_queue using struct and map
我有结构:
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
中创建 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
构造错误:
function "nodeCompare" is not a type name
补充问题:
如果我以这种方式创建我的矢量,也许有一些方法可以将节点推入 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
}
priority_queue 模板参数不期望函数而是对象类型
template <class T, class Container = vector<T>,
class Compare = less<typename Container::value_type> > class priority_queue;
所以只需将该函数包装到一个 struct/class(仿函数)中就可以了。
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 结构中的比较器,只需创建一个内部结构
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 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
中创建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
构造错误:
function "nodeCompare" is not a type name
补充问题: 如果我以这种方式创建我的矢量,也许有一些方法可以将节点推入 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
}
priority_queue 模板参数不期望函数而是对象类型
template <class T, class Container = vector<T>,
class Compare = less<typename Container::value_type> > class priority_queue;
所以只需将该函数包装到一个 struct/class(仿函数)中就可以了。
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 结构中的比较器,只需创建一个内部结构
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());