2010-04-15 33 views
2

我正在嘗試使用boost lambda來避免編寫簡單的函數。 例如,我想用lambda來訪問結構的成員或調用類的方法,如:試圖使用boost lambda,但我的代碼不會編譯

#include <vector> 
#include <utility> 
#include <algorithm> 
#include <boost/lambda/lambda.hpp> 

using namespace std; 
using namespace boost::lambda; 

vector< pair<int,int> > vp; 

vp.push_back(make_pair<int,int>(1,1)); 
vp.push_back(make_pair<int,int>(3,2)); 
vp.push_back(make_pair<int,int>(2,3)); 

sort(vp.begin(), vp.end(), _1.first > _2.first); 

當我嘗試編譯這個我收到以下錯誤:

error C2039: 'first' : is not a member of 'boost::lambda::lambda_functor<T>' 
     with 
     [ 
      T=boost::lambda::placeholder<1> 
     ] 
error C2039: 'first' : is not a member of 'boost::lambda::lambda_functor<T>' 
     with 
     [ 
      T=boost::lambda::placeholder<2> 
     ] 

由於vp包含pair<int,int>我認爲_1.first應該工作。我做錯了什麼?

+0

使用佔位符的成員函數時,lambda會變得有點複雜。您必須將成員方法綁定到佔位符(文檔中有一個示例)。然而替代方案是寫入存取器,例如'first(_1)> second(_2)'這在我看來有點清潔 – Anycorn 2010-04-15 05:12:44

回答

7

你需要的是一個類似於:

#include <boost/lambda/bind.hpp> // new header 

// typedefs make code easier 
typedef pair<int,int> pair_type; 
typedef vector<pair_type> vector_type; 

vector_type vp; 

vp.push_back(make_pair(1,1)); // don't specify template arguments! 
vp.push_back(make_pair(3,2)); // the entire point of make_pair is 
vp.push_back(make_pair(2,3)); // to deduce them. 

sort(vp.begin(), vp.end(), 
     bind(&pair_type::first, _1) > bind(&pair_type::first, _2)); 
+0

我喜歡你的typedefs,但你仍然重複很多。你可以執行'vp.push_back(vector_type :: value_type(1,1));'使未來的維護更簡單(如果你想使用長整型,只需要改變一行)。 – Tim 2010-04-15 05:31:58

+0

@Tim:糟糕,我甚至沒有考慮過那個代碼,那只是複製粘貼而已。我會這樣做。 (編輯) – GManNickG 2010-04-15 05:33:10

+0

'make_pair'的問題在於,如果'int'沒問題,試試'vector >',那麼你必須在每個數字附近精確地使用'f'。 。參數演繹與數字混亂:/ – 2010-04-15 07:07:53

4

this,我相信語法是

sort(vp.begin(), vp.end(), 
bind(&pair<int,int>::first, _1) > bind(&pair<int,int>::first, _2)); 

不過,我想指出的(不是這樣呢?)明顯 - sort(vp.begin(), vp.end());基本上會做同樣的事情。 pair s默認按照它們的第一個參數排序,然後按第二個參數排序。由於您使用的是sort(這不穩定),因此您將按first排序所有對,然後與first相同的對將或多或少地隨機排列。

如果您想要在第一個元素相同時保留順序,則應該使用stable_sort代替。

+0

對於'pair'的預先存在的比較器+1。 – GManNickG 2010-04-15 05:28:47

+0

非常好,謝謝。 (關於對 - 我只是爲了簡化代碼) – hamishmcn 2010-04-15 05:37:57

+1

我有一種感覺,這只是一個例子,但我想確保:) – rlbond 2010-04-15 05:41:07