2016-03-04 82 views
0

發佈代碼的背景: PayRoll是類的名稱。 personSalary是一個雙類型變量,personAge是一個整型變量。給出的代碼是按年齡或薪水排列列表。無法解釋此C++代碼

struct less_than_salary 
    { 
     inline bool operator() (const PayRoll& struct1, const PayRoll& struct2) 
     { 
     return (struct1.personSalary < struct2.personSalary); 
     } 
    }; 

struct less_than_age 
    { 
     inline bool operator() (const PayRoll& struct1, const PayRoll& struct2) 
     { 
     return (struct1.personAge < struct2.personAge); 
     } 
    }; 

我想了解一下這部分給定代碼的一些幫助。我試着讀結構用於和據我所知,它基本上是作爲一個類來操作,並允許您一次處理多種類型的變量。如果我錯了,在這種情況下用到的結構究竟是什麼? 另外,如果有人解釋「inline bool operator()」在做什麼,我會很感激,因爲我之前從未見過這樣的內容,而且通過閱讀教科書我無法理解。 謝謝你的幫助!

+1

嘗試google搜索 「函子」。 –

+1

你的意思是你不懂操作符重載的概念嗎? 'operator()'允許類的一個實例對一個* function-call *操作符做出反應。 – jxh

+0

是的,這是我的問題,我很難理解操作符重載。 – ss1111

回答

1

像這樣的結構可以在STL功能sort中使用,該功能在諸如std::list之類的數據結構中是可用的。

#include <list> 
#include <iostream> 

int main() { 
    std::list<int> example = {9,8,7,6,5,4,3,2,1}; 

    struct { 
     bool operator()(const int lhs, const int rhs) { 
      return lhs < rhs; 
     } 
    } compare_list; 

    example.sort(compare_list); 

    for(auto &i : example) { 
     std::cout<<i<<" "; 
    } 
} 

輸出:

1 2 3 4 5 6 7 8 9 

要理解這是如何工作的,考慮以下幾點:

//.. 
testS(compare_list); 
//.. 

template <typename T> 
void testS(T t) { 
    std::cout<< t(4,5) << "\n"; 
    std::cout<< t(5,4) << "\n"; 
} 

輸出將

1 
0 
+0

+1謝謝你的解釋!我明白代碼現在是如何工作的!我還有一個問題。所以_bool operator()_基本上接受了lhs和rhs,使得它們看起來像是_bool_正確的?否則,你會得到一個錯誤,說「operator == not defined」? – ss1111

+0

是的,我們的'compar_list'結構實現了'()'運算符。 '()'操作符使得它成爲一個函子,這意味着它可以像函數一樣被調用。 它需要兩個參數並返回_lhs

2

這兩個結構都是所謂的「仿函數」的實現。定使用像

PayRoll x; 
PayRoll y 
    // initialise x and y 

less_than_salary f; 

if (f(x,y)) // this calls less_than_salary::operator()(x,y) 
    std::cout << "X has lower salary than Y\n"; 
else 
    std::cout << "X has higher salary than Y\n"; 

此外,給定的PayRoll陣列,也能夠

PayRoll a[20]; 

// initialise elements of a 

less_than_salary f; 
std::sort(a, a+20, f); // will sort in order of ascending salary 

std::sort(a, a+20, less_than_salary()); // does same as preceding two lines 

標準集裝箱(std::vector<PayRoll>等)也可以使用排序。

less_than_age允許做基本上相同的事情,但使用年齡而不是tnan工資作爲排序標準。

這裏沒有函數重載。這兩種結構類型都提供了operator(),但這不是超載。

+0

+1謝謝!你能否詳細說明爲什麼沒有函數重載?我還是不太明白,我正在努力學習。 – ss1111

+0

函數重載在同一範圍內提供具有相同名稱的函數,它們接受不同的參數類型。你正在做的是提供兩個結構類型,每個結構類型都有一個'operator()',它們具有相同的參數類型。每個結構類型都是不同的作用域。 – Peter