Lambada表達式的做用

Lambda函數的用處

 
假設你設計了一個地址簿的類。如今你要提供函數查詢這個地址簿,可能根據姓名查詢,可能根據地址查詢,還有可能二者結合。要是你爲這些狀況都寫個函數,那麼你必定就跪了。因此你應該提供一個接口,能方便地讓用戶自定義本身的查詢方式。在這裏能夠使用lambda函數來實現這個功能。
[cpp]  view plain copy
 
  1. #include <string>  
  2. #include <vector>  
  3.   
  4. class AddressBook  
  5. {  
  6.     public:  
  7.     // using a template allows us to ignore the differences between functors, function pointers   
  8.     // and lambda  
  9.     template<typename Func>  
  10.     std::vector<std::string> findMatchingAddresses (Func func)  
  11.     {   
  12.         std::vector<std::string> results;  
  13.         for ( auto itr = _addresses.begin(), end = _addresses.end(); itr != end; ++itr )  
  14.         {  
  15.             // call the function passed into findMatchingAddresses and see if it matches  
  16.             if ( func( *itr ) )  
  17.             {  
  18.                 results.push_back( *itr );  
  19.             }  
  20.         }  
  21.         return results;  
  22.     }  
  23.   
  24.     private:  
  25.     std::vector<std::string> _addresses;  
  26. };  

從上面代碼能夠看到,findMatchingAddressses函數提供的參數是Func類型,這是一個泛型類型。在使用過程當中應該傳入一個函數,而後分別對地址簿中每個entry執行這個函數,若是返回值爲真那麼代表這個entry符合使用者的篩選要求,那麼就應該放入結果當中。那麼這個Func類型的參數如何傳入呢?
 
[cpp]  view plain copy
 
  1. AddressBook global_address_book;  
  2.   
  3. vector<string> findAddressesFromOrgs ()  
  4. {  
  5.     return global_address_book.findMatchingAddresses(   
  6.         // we're declaring a lambda here; the [] signals the start  
  7.         [] (const string& addr) { return addr.find( ".org" ) != string::npos; }   
  8.     );  
  9. }  

能夠看到,咱們在調用函數的時候直接定義了一個lambda函數。參數類型是
[cpp]  view plain copy
 
  1. const string& addr  
返回值是bool類型。
若是用戶要使用不一樣的方式查詢的話,只要定義不一樣的lambda函數就能夠了。
相關文章
相關標籤/搜索