繁体   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