2016-10-19 72 views
1

您好,非常感謝提前!重載函數在struct中調用operator()/參數發生了什麼?

我使用std::uniqueerasestd::vector。爲了檢查唯一性,我調用了一個結構的布爾函數。因爲我想使用預定義的容差,我嘗試添加一個構造函數,以傳遞所需的值。它有效,但我不知道爲什麼。

std::vector<std::pair<int,double> > myVec; 

struct Check{ 

    double tol_ = 0.0; 
    Check(double tol) : tol_(tol) 
    {   
    } 

    bool operator()(const std::pair<int,double> &a, 
        const std::pair<int,double> &b) 
    { 
    return fabs(a.second-b.second) < tol_; 
    } 
}; 

// fill vector 
... 

// remove duplicates 
myVec.erase(std::unique(myVec.begin(), myVec.end(), Check(0.1)), myVec.end()); 

這是否在某種程度上是合理的做法?我有點困惑於unique。達到此功能時,使用公差構造結構Check。 Next unique再次調用這個結構來通過傳遞它們作爲參考來比較向量元素?

感謝您的努力!

+0

你爲什麼這樣做'myVec->'開頭的(),而不是'myVec.begin()'? – PRP

+1

首先['std :: unique'](http://en.cppreference.com/w/cpp/algorithm/unique)刪除重複*連續*元素。這意味着你的範圍必須被分類。其次,'myVec'似乎不是一個指針,使用箭頭成員訪問操作符是錯誤的。最後,*如何*它不起作用?你能否詳細說明一下? –

+0

你有任何問題嗎?我的意思是我只能回答「是」。這是合理的做法,並以此方式完成。所以你是對的這是如何工作的。 – Hayt

回答

2

當您在撥打std::unique時撥打Check(0.1)時會發生什麼情況,即創建了臨時對象。這個臨時對象將有一個生命週期到完整表達式的末尾。

將臨時對象像任何其他對象一樣傳遞給std::unique函數。這是有效的,因爲這個參數是一個模板參數,並且可以有任何類型的匹配使用它。

總之調用std::unique大致相當於是這樣的:

// Enter new nested local scope 
{ 
    Check temporary_object(0.1); // Create object 
    std::unique(..., temporary_object); 
} 
// Left nested scope, the `temporary_object` is destructed 
+0

感謝您的澄清! 這意味着,在創建了臨時對象(在你寫爲'std :: unique(...,temporary_object);')後,唯一函數使用類似'temporary_object(&a,&b)多次調用臨時對象「 '由bool操作符()(...)重載' – AnBr

+0

@AnBr是的,這是正確的。 –

相關問題