关系运算符重载在 C++ 中不起作用
relational operator overloading not working in C++
我正在尝试使用自定义 priority_queue 在 C++ 中实现霍夫曼编码。我将信息存储在名为 Node 的结构中。这是代码
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
//two same name functions are for min heap and max heap(Function overloading)
struct Node{
char letter;
int value;
Node* left;
Node* right;
Node(char letter,int value, Node* left,Node* right){
this->letter = letter;
this->value = value;
this->left = left;
this->right = right;
}
bool operator < (const Node* &a){//HERE IS THE PROBLEM
if((this->value) < (a->value))
return true;
else
return false;
}
bool operator > (const Node* &a){//HERE IS THE PROBLEM
if((this->value) > (a->value))
return true;
else
return false;
}
};
template <class T>
class Priority_Queue{
public:
int k;
int sz;
vector<T> v;
Priority_Queue(int k){
sz = 0;
this->k = k;
}
void heapify(int index,int n){
int max_index = index;
for(int i = index*k+1;i <= min(n-1,index*k+k);++i){
if(v[i] > v[max_index])
max_index = i;
}
if(index != max_index){
swap(v[max_index],v[index]);
heapify(v,max_index,n);
}
}
void heapify(vector<int> &v,int index,int n,bool trigger){
//for calling min_heapify using function overloading
int min_index = index;
for(int i = index*k+1;i <= min(n-1,index*k+k);++i){
if(v[i] < v[min_index])
min_index = i;
}
if(index != min_index){
swap(v[min_index],v[index]);
heapify(v,min_index,n,trigger);
}
}
void Insert(T val){
if(sz == (int)v.size()){
v.push_back(val);
++sz;
}
else
v[sz++] = val;
int parent = (sz-1)/k;
int node = sz-1;
while(node >= 1){
int parent = (node-1)/k;
if(v[parent] < v[node]){
swap(v[parent],v[node]);
node = parent;
parent = (parent-1)/k;
}
else
break;
}
}
void Insert(T val, bool trigger){
if(sz == (int)v.size()){
v.push_back(val);
++sz;
}
else
v[sz++] = val;
int parent = (sz-1)/k;
int node = sz-1;
while(node >= 1){
int parent = (node-1)/k;
if(v[parent] > v[node]){// IF CONDITION DOESN'T WORK
swap(v[parent],v[node]);
node = parent;
parent = (parent-1)/k;
}
else
break;
}
}
void Pop(){
if(sz == 0){
cout << "Heap Underflow\n";
return;
}
swap(v[0],v[sz-1]);
--sz;
heapify(0,sz);
}
void Pop(bool trigger){
if(sz == 0){
cout << "Heap Underflow\n";
return;
}
swap(v[0],v[sz-1]);
--sz;
heapify(0,sz,trigger);
}
T Top(){
return v[0];
}
void printHeap(){
for(int i = 0; i < sz;++i){
cout << v[i]->value << " ";
}
cout << "\n";
}
};
int main()
{
string s;
cin >> s;
int n = s.length();
vector<int> freq(26,0);
for(int i = 0; i < n;++i){
++freq[s[i]-'a'];
}
Priority_Queue<Node*> pq(2);
for(int i = 0; i < 26;++i){
if(freq[i] == 0)
continue;
pq.Insert(new Node(char(i+'a'),freq[i],NULL,NULL),true);
}
pq.printHeap();
}
我没有太多 C++ 经验,我在重载关系运算符时遇到问题,我想根据值 parameter.For 比较两个结构指针示例:如果我输入 aab
,应该执行 Insert 函数中的 if 条件,但它从未发生过。我搜索了很多有关关系运算符重载的信息,但其中 none 似乎解决了我面临的问题。有人可以帮帮我吗 ?重载运算符时我做错了什么?
您可能应该使您的方法看起来像这样:
bool operator<(const Node &node) const {
return value < node.value;
}
注意方法签名略有不同。然后你应该用一个绝对最小的方法来测试它。
int main(int, char **) {
Node first{'a', 10, nullptr, nullptr};
Node second{'b', 5, nullptr, nullptr};
cout << "first < second: " << (first < second) << endl;
cout << "second < first: " << (second < first) << endl;
}
在您的代码中,您可能必须这样做:
if (*v[index] < *v[otherIndex)
另一条评论:不要像 v
这样命名变量。随着你的程序变得越来越大,这会从背后咬你一口。为他们提供更易于搜索和描述的更长名称。 vec
优于 v
.
我正在尝试使用自定义 priority_queue 在 C++ 中实现霍夫曼编码。我将信息存储在名为 Node 的结构中。这是代码
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
//two same name functions are for min heap and max heap(Function overloading)
struct Node{
char letter;
int value;
Node* left;
Node* right;
Node(char letter,int value, Node* left,Node* right){
this->letter = letter;
this->value = value;
this->left = left;
this->right = right;
}
bool operator < (const Node* &a){//HERE IS THE PROBLEM
if((this->value) < (a->value))
return true;
else
return false;
}
bool operator > (const Node* &a){//HERE IS THE PROBLEM
if((this->value) > (a->value))
return true;
else
return false;
}
};
template <class T>
class Priority_Queue{
public:
int k;
int sz;
vector<T> v;
Priority_Queue(int k){
sz = 0;
this->k = k;
}
void heapify(int index,int n){
int max_index = index;
for(int i = index*k+1;i <= min(n-1,index*k+k);++i){
if(v[i] > v[max_index])
max_index = i;
}
if(index != max_index){
swap(v[max_index],v[index]);
heapify(v,max_index,n);
}
}
void heapify(vector<int> &v,int index,int n,bool trigger){
//for calling min_heapify using function overloading
int min_index = index;
for(int i = index*k+1;i <= min(n-1,index*k+k);++i){
if(v[i] < v[min_index])
min_index = i;
}
if(index != min_index){
swap(v[min_index],v[index]);
heapify(v,min_index,n,trigger);
}
}
void Insert(T val){
if(sz == (int)v.size()){
v.push_back(val);
++sz;
}
else
v[sz++] = val;
int parent = (sz-1)/k;
int node = sz-1;
while(node >= 1){
int parent = (node-1)/k;
if(v[parent] < v[node]){
swap(v[parent],v[node]);
node = parent;
parent = (parent-1)/k;
}
else
break;
}
}
void Insert(T val, bool trigger){
if(sz == (int)v.size()){
v.push_back(val);
++sz;
}
else
v[sz++] = val;
int parent = (sz-1)/k;
int node = sz-1;
while(node >= 1){
int parent = (node-1)/k;
if(v[parent] > v[node]){// IF CONDITION DOESN'T WORK
swap(v[parent],v[node]);
node = parent;
parent = (parent-1)/k;
}
else
break;
}
}
void Pop(){
if(sz == 0){
cout << "Heap Underflow\n";
return;
}
swap(v[0],v[sz-1]);
--sz;
heapify(0,sz);
}
void Pop(bool trigger){
if(sz == 0){
cout << "Heap Underflow\n";
return;
}
swap(v[0],v[sz-1]);
--sz;
heapify(0,sz,trigger);
}
T Top(){
return v[0];
}
void printHeap(){
for(int i = 0; i < sz;++i){
cout << v[i]->value << " ";
}
cout << "\n";
}
};
int main()
{
string s;
cin >> s;
int n = s.length();
vector<int> freq(26,0);
for(int i = 0; i < n;++i){
++freq[s[i]-'a'];
}
Priority_Queue<Node*> pq(2);
for(int i = 0; i < 26;++i){
if(freq[i] == 0)
continue;
pq.Insert(new Node(char(i+'a'),freq[i],NULL,NULL),true);
}
pq.printHeap();
}
我没有太多 C++ 经验,我在重载关系运算符时遇到问题,我想根据值 parameter.For 比较两个结构指针示例:如果我输入 aab
,应该执行 Insert 函数中的 if 条件,但它从未发生过。我搜索了很多有关关系运算符重载的信息,但其中 none 似乎解决了我面临的问题。有人可以帮帮我吗 ?重载运算符时我做错了什么?
您可能应该使您的方法看起来像这样:
bool operator<(const Node &node) const {
return value < node.value;
}
注意方法签名略有不同。然后你应该用一个绝对最小的方法来测试它。
int main(int, char **) {
Node first{'a', 10, nullptr, nullptr};
Node second{'b', 5, nullptr, nullptr};
cout << "first < second: " << (first < second) << endl;
cout << "second < first: " << (second < first) << endl;
}
在您的代码中,您可能必须这样做:
if (*v[index] < *v[otherIndex)
另一条评论:不要像 v
这样命名变量。随着你的程序变得越来越大,这会从背后咬你一口。为他们提供更易于搜索和描述的更长名称。 vec
优于 v
.