2013-10-18 95 views
2

我剛剛看了STL的STLs的this lecture傳遞給多參數lambda表達式的參數

的57分鐘進入講座中,我們有這樣的代碼:

#include <iostream> 
#include <vector> 
#include <string> 
#include <algorithm> 

int main() 
{ 
    std::vector<std::string> v; 

    v.push_back("cat"); 
    v.push_back("antelope"); 
    v.push_back("puppy"); 
    v.push_back("bear"); 

    std::sort(v.begin(), v.end(), 
       [](const std::string& left, const std::string& right) 
        { 
         return left.size() < right.size(); 
        } 
      ); 

    for (std::vector<std::string>::iterator i = v.begin(); i != v.end(); ++i) 
    { 
     std::cout << *i << " "; 
    } 

    std::cout << std::endl; 

    return 0; 
} 

正如預期的那樣,這個打印向量中的弦增加其長度的順序。我的問題是關於lambda表達式,它是sort函數的第三個參數。在內部,什麼傳遞給輸入參數'左'&'正確'?

我加了一行:

std::cout << "left: " << left << ", right: " << right << std::endl; 

拉姆達的身體裏面,我得到的輸出是:

左:羚羊,右:貓
左:羚羊,右:貓
左:小狗,右:貓
左:小狗,右:羚羊
左:小狗,右:貓
左:熊,右:貓
左:熊,右:羚羊
左:熊,右:小狗
左:熊,右:貓
貓大熊小狗羚羊

所以它看起來像「左'和'正確的'參數在某種程度上與內部排序算法有關。任何人都可以更清楚地知道究竟發生了什麼?

我的理解是,如果lambda是一個一元函數,那麼它的輸入參數就是迭代器當前指向的任何東西。它是否正確?
但使用二元函數,輸入參數困惑我。

+0

我錯過了什麼,或者你在問爲什麼比較函數比較*兩個*東西需要*兩個*參數?在排序算法運行時,它經常比較項目以確定它們的「順序」是否正確,強調單詞「項目」中的** s **。 – WhozCraig

+1

我明白,比較函數需要兩件事。我的問題是'哪些'有兩件事正在傳遞給比較器,如果可能的話,'如何'。換句話說,作爲程序員,我可以期望得到什麼作爲輸入參數,以便我可以決定在lambda內執行什麼檢查。 – Gautam

+2

@Gautam啊。你可以期待你的序列中的任何東西。何時和如何 - 經常出現的東西完全取決於正在使用的算法。並且我建議您在編寫自己的文章之前徹底理解嚴格 - 弱 - 排序的概念,尤其是在編寫基於複雜對象中多個字段值的訂單時。 – WhozCraig

回答

5

大多數排序算法的核心是兩個元素之間的比較,以確定哪一個應該在另一個之前。例如,這裏是快速排序,取自Wikipedia

function quicksort(array) 
    if length(array) ≤ 1 
     return array // an array of zero or one elements is already sorted 
    select and remove a pivot element pivot from 'array' // see '#Choice of pivot' below 
    create empty lists less and greater 
    for each x in array 
     *****if x ≤ pivot then append x to less***** this line here 
     else append x to greater 
    return concatenate(quicksort(less), list(pivot), quicksort(greater)) // two recursive calls 

在該僞碼的情況下,比較本

if x ≤ pivot 

注意,這是一個二進制操作中,兩個參數被x,和pivot。在標準庫函數std::sort的情況下,這將改爲:

if (comp(x,pivot)) 

哪裏comp是你在通過作爲最後一個參數的函子。因此,要回答你的問題:「哪兩件事開始傳入比較器」,無論該範圍中的哪兩個元素需要在該算法邏輯的特定時間進行比較。

+0

+1:... perf。 :-) –

+0

謝謝你的答案。另外,我對單參數lambda正確的理解是什麼?從這個問題引用:「......如果lambda是一個一元函數,那麼它的輸入參數就是迭代器當前指向的任何東西......」 – Gautam

相關問題