簡體   English   中英

為什么lambda函數用於stl函數,例如C ++中的sort(),max_element()函數將兩個參數作為輸入?

[英]Why does lambda function used for stl functions such as sort() , max_element() function in C++ take two arguments as input?

我試圖理解在sort()運算符中使用lambda函數。 有存儲類型的對象的矢量person ; sort()函數用於迭代向量person並基於類成員id對其進行排序。

我不明白為什么sort函數中使用的lambda函數需要兩個輸入,即。 p1p2 ?,為什么不輸入一個對象p1 我一直認為stl函數(如sort()max_element()將迭代器返回給一個元素。

class Person
    {
      private:
        string firstName;
        string lastName;
        int id;

      public:
        Person(const string& fn, const string& ln, int i)
             : firstName(fn), lastName(ln), id(i) { }

        const string& getFirstName() const { return firstName; }
        const string& getLastName() const { return lastName; }
        int getID() const { return id; }
    };

main(){
vector<Person> people;
people.push_back(Person("Davor", "Loayza", 62341));
people.push_back(Person("Eva", "Lopez", 12345));
people.push_back(Person("Julio", "Sanchez", 54321));
people.push_back(Person("Adan", "Ramones", 70000));

sort(people.begin(), people.end(), [](const Person& p1, const Person& p2)
{
  return p1.getID() < p2.getID();
});
return 0;
}

編輯:可能我需要重述我的問題,我的問題是如何在sort()函數中發生迭代器增量。 在iterator = people.begin()的最開始,為p1分配了什么值,為p2分配了什么值? 類似地,當iterator = people.end()時會發生什么? 我很難理解這個過程背后的邏輯嗎?

要了解std::sort ,您必須首先了解排序是什么。 這是給你的練習:

找到一副紙牌。 我會假設你知道哪些卡有較高的排名比其他卡相比 ; 否則這可能會令人困惑。 無論王牌是高於王還是低於2,都不會影響。 你現在可以忽略西裝。

將卡片連續放置(或風扇以節省空間)。 目標是找出具有較高等級的任何卡是否在具有較低等級的卡之前。 想想你怎么能找到它?

這是如何:從第一張和第二張卡開始。 比較他們的排名。 第一張卡的排名是否高於第二張? 如果是這樣的話,我們得出的結論是,我們尋求的答案是“是的,有一張排名較高的牌位於排名較低的牌之前”。 如果第一張牌的排名不高於第二張牌,那么我們還不能回答這個問題。 我們必須繼續比較第二張卡和第三張卡,然后重復這個過程。

如果你到達牌組的末尾而沒有找到排名較低的牌之前的更高級別的牌,那么我們尋求的答案是“否”。 讓我們稱這樣的甲板分類 (或訂購)。

第二個練習:如果甲板沒有分類,你怎么能把它分類?

這就是:就像在第一次練習中一樣,從前兩張牌開始。 這一次,如果它們不是所需的順序,則交換它們的位置,使拳頭成為第二個,第二個成為第一個。 現在這兩個卡相對於彼此排序。 然后轉到第二個和第三個並重復該過程。 你會發現你可能需要多次重復這個過程,因為一次迭代不一定足夠。

讓我們稱這個過程為排序 (更具體地說,這是比較排序)。 這就是std::sort作用。 它一次比較兩個元素,並交換元素,直到任何相鄰對之間的所有比較都為真,即直到范圍被排序。

您在兩張牌之間進行的比較類似於由std::sort的比較函數對象參數完成的比較步驟。 如果您一次只查看一張卡,您將無法確定它是否處於其有序位置。


為什么lambda函數用於stl函數,例如C ++中的sort(),max_element()函數將兩個參數作為輸入?

因為這些函數的比較函數對象參數表示迭代器范圍的兩個元素之間的順序關系。 訂單關系是二元關系。

為什么不只輸入一個對象p1?

因為一元關系不能代表訂單。

我一直認為stl函數(如sort()和max_element())將迭代器返回給一個元素。

sort()函數返回多少個迭代器?

std::sort根據文檔返回void 也就是說,這些函數返回的內容與比較函數對象參數的arity幾乎沒有關系。

我的問題是在sort()函數中如何發生迭代器增量

這沒有指定。 算法的實現者可以選擇如何遞增迭代器。 排序算法通常使用多個迭代器。

iterator = people.begin()的最開始,為p1分配了什么值,為p2分配了什么值?

排序算法不必從范圍的開頭開始。 目前還不清楚你用iterator指的是什么。

p1p2將是[first, last)范圍內的一些對元素。 究竟哪一對由算法來決定。

在容器中的元素上調用lambda函數,以比較一個是否大於另一個。 它不僅僅是為了返回sort調用一次: sort返回任何內容。 它需要兩個參數才能進行比較。 如果它只采用一個參數,它會與它進行比較?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM