[英]relational operator overloading not working in C++
我正在嘗試使用定制的priority_queue在C++中實現霍夫曼編碼。 我將信息存儲在名為 Node.js 的結構中。 這是代碼
#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++ 沒有太多經驗,並且在重載關系運算符時遇到了麻煩,我想根據 value 參數比較兩個結構指針。例如:如果我輸入aab
,則應該執行 Insert function 中的 if 條件,但它永遠不會發生。 我搜索了很多關於關系運算符重載的信息,但它們似乎都沒有解決我面臨的問題。 有人可以幫幫我嗎? 重載運算符時我做錯了什么?
您可能應該使您的方法如下所示:
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
好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.