Kar*_*rma 2 c++ stl vector object
我试图理解在sort()运算符中使用lambda函数.有一个存储类型对象的向量person; sort()函数用于迭代向量person并基于类成员对其进行排序id.
我不明白为什么sort函数中使用的lambda函数需要两个输入,即.p1和p2?,为什么不输入一个对象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;
}
Run Code Online (Sandbox Code Playgroud)
编辑:可能是我需要重述我的问题,我的问题是如何在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::sortvoid按文档返回.也就是说,这些函数返回的内容与比较函数对象参数的arity几乎没有关系.
我的问题是在sort()函数中如何发生迭代器增量
这没有指定.算法的实现者可以选择如何递增迭代器.排序算法通常使用多个迭代器.
在最开始的时候
iterator = people.begin(),分配了p1什么值以及分配了什么值p2?
排序算法不必从范围的开头开始.目前还不清楚你所指的是什么iterator.
p1并且p2将是范围内的一些对元素[first, last).究竟哪一对由算法来决定.
| 归档时间: |
|
| 查看次数: |
92 次 |
| 最近记录: |