Lambda表达式如何接收参数?其传参逻辑是否与迭代器工作原理有关?
Lambda参数传递的核心逻辑
Lambda本质就是一个匿名可调用对象,参数传递规则和普通函数完全一致,不存在不需要匹配参数数量的情况。你不需要手动给它传参的原因是:你没有直接调用这个Lambda,而是把它作为比较器参数传给了std::sort,参数实际是由std::sort的内部逻辑负责传入的。
std::sort比较器的参数来源
std::sort要求第三个参数是符合如下规则的可调用对象:
- 接收2个和容器元素类型一致的入参
- 返回布尔值,代表「第一个入参是否应该排在第二个入参的前面」
std::sort内部执行排序逻辑时,每次需要判断两个元素的先后顺序,就会从容器中取出两个待比较的元素,分别传入你提供的比较器的两个形参,你写的Lambda的i和j对应的就是这两个待比较的元素。
你举的例子里Lambda写的是return i>j;,意思就是告诉std::sort:如果i大于j,就把i排在j前面,最终排序结果就是降序。
和迭代器的关系
迭代器本身确实只存储单个元素的位置,每次解引用只能拿到一个元素值,但std::sort在比较的时候会取两个不同的迭代器,分别解引用拿到两个元素值,再一起传给比较器,和迭代器的工作原理没有冲突。
可以参考std::sort内部的简化示意逻辑:
// 仅做逻辑示意,非实际实现 template <typename Iter, typename Comp> void sort(Iter begin, Iter end, Comp comp) { // ... 排序算法核心逻辑 while (需要比较两个元素) { Iter a = 待比较位置1的迭代器; Iter b = 待比较位置2的迭代器; if (comp(*a, *b)) { // 这里就是给Lambda传入两个参数的位置 交换两个元素的位置; } } // ... }
内容的提问来源于stack exchange,提问作者YoonYeong Jeong
相关产品推荐
相关产品推荐

