2010-01-22 41 views
6

我正在閱讀一篇StackOverFlow文章,內容是按照對的第二個元素對一個對的向量進行排序。最明顯的答案是創建一個謂詞,但是使用boost的一個答案引起了我的注意。幫助理解boost :: bind佔位符參數

std::sort(a.begin(), a.end(), 
    boost::bind(&std::pair<int, int>::second, _1) < 
    boost::bind(&std::pair<int, int>::second, _2)); 

我一直在試圖找出如何提高::綁定工作,或者至少是如何使用它,但我想不出什麼的佔位符參數的目的_1和_2是,並且增強文檔根本不會沉入其中。

任何人都可以解釋這個具體的使用boost :: bind?

P.S.原始問題:How do I sort a vector of pairs based on the second element of the pair?

回答

7

該表達式:

boost::bind(&std::pair<int, int>::second, _1) < 
boost::bind(&std::pair<int, int>::second, _2) 

即,使用<操作者的實際定義另外兩個函子,這兩者通過bind定義之間的算符。

通過某種預期的仿函數需要有一個operator(),看起來像這樣:

bool operator()(const T& arg1, const T& arg2); 
當你使用升壓轉換器的 <那麼域名持有者 _1_2創造一個仿函數

對應arg1和的arg2你正在創建的函子。

bind調用創建一個調用的arg1::secondarg2

運氣好的話算符,C++ 0x中引入lambda表達式會作出這樣過時的表達式。

+0

備案:'typedef std :: pair pair_type; std :: sort(a.begin(),a.end(),[](pair_type x,pair_type y){return x.second GManNickG 2010-01-23 03:44:31

5

std :: sort需要一個二元謂詞來比較範圍中的兩個項目。佔位符顯示將使用第一個和第二個參數的位置。

boost :: bind使整個表達式讀取爲_1.second < _2.second(除了因爲。操作符不可重載,所以無法實現這種表達)。

這兩個綁定調用,在這種情況下,創建一個函數對象,接受pair<int, int>並返回值secondoperator<又被重載以返回比較先前仿函數結果的另一個二元仿函數。這被std::sort使用。