當我嘗試在比較器函式中使用宣告為類變數的映射“freq”的內容對向量進行排序時(使用映射按頻率對向量元素進行排序),我遇到了這個錯誤。誰能強調我哪里出錯了,我該怎么辦?這是代碼:
class Solution {
map<int, int> freq;
public:
static bool comp(int a, int b){
if(a!=b){
int c1 = freq[a];
int c2 = freq[b];
if(c1!=c2)
return c1<c2;
else{
return a>b;
}
}
return a>b;
}
vector<int> frequencySort(vector<int>& nums) {
for(int i:nums){
freq[i] ;
}
sort(nums.begin(), nums.end(), comp);
return nums;
}
};
錯誤是: 第 6 行:字符 22:錯誤:在靜態成員函式 int c1 = freq[a] 中無效使用成員 'freq';^~~~
uj5u.com熱心網友回復:
靜態函式不能訪問成員物件。但是如果你創建comp一個非靜態成員函式,你就不能再將它傳遞給sort.
一種解決方案是制作comp非靜態并將其包裝在對 的呼叫中的 lambda 中sort,例如:
class Solution {
map<int, int> freq;
public:
bool comp(int a, int b){
if(a!=b){
int c1 = freq[a];
int c2 = freq[b];
if(c1!=c2)
return c1<c2;
else{
return a>b;
}
}
return a>b;
}
vector<int> frequencySort(vector<int>& nums) {
for(int i:nums){
freq[i] ;
}
sort(nums.begin(), nums.end(), [this](int a, int b) { return comp(a,b); });
return nums;
}
};
uj5u.com熱心網友回復:
靜態成員函式不系結到任何物件,即它們沒有this指標。因此,我們無法參考this靜態成員函式的內部。此限制適用于通過呼叫非靜態成員的顯式使用和this隱式使用。this
解決方案 1
解決這個問題的一種方法是制作freq一個靜態資料成員。演示
解決方案 2
另一種方法是制作comp一個非靜態成員函式。演示。請注意,這可能會導致其他邏輯錯誤,例如comp不能再用作比較器。
uj5u.com熱心網友回復:
在 C 中,對靜態成員函式的呼叫不系結到任何物件,因此不包含任何隱式this指標。另一方面,每個物件都接收自己的一組資料成員。在您的特定示例中,freq是資料成員,comp是靜態成員函式并且frequencySort是非靜態成員函式。對非靜態成員函式的呼叫被系結到類的一個物件,因此接收一個隱式this指標。隱式this指標用于訪問成員函式內部的資料成員。
現在,在您的特定情況下,如果comp沒有對類物件的任何顯式訪問,靜態成員函式就無法訪問資料成員,因為靜態成員函式沒有隱式this指標。
制作freq靜態資料成員應該可以解決問題,并且可能是您想要的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/441061.html
