我剛剛看了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是一個一元函數,那麼它的輸入參數就是迭代器當前指向的任何東西。它是否正確?
但使用二元函數,輸入參數困惑我。
我錯過了什麼,或者你在問爲什麼比較函數比較*兩個*東西需要*兩個*參數?在排序算法運行時,它經常比較項目以確定它們的「順序」是否正確,強調單詞「項目」中的** s **。 – WhozCraig
我明白,比較函數需要兩件事。我的問題是'哪些'有兩件事正在傳遞給比較器,如果可能的話,'如何'。換句話說,作爲程序員,我可以期望得到什麼作爲輸入參數,以便我可以決定在lambda內執行什麼檢查。 – Gautam
@Gautam啊。你可以期待你的序列中的任何東西。何時和如何 - 經常出現的東西完全取決於正在使用的算法。並且我建議您在編寫自己的文章之前徹底理解嚴格 - 弱 - 排序的概念,尤其是在編寫基於複雜對象中多個字段值的訂單時。 – WhozCraig