2013-10-18 53 views
2

我刚刚看了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是一个一元函数,那么它的输入参数就是迭代器当前指向的任何东西。它是否正确?
但使用二元函数,输入参数困惑我。

+0

我错过了什么,或者你在问为什么比较函数比较*两个*东西需要*两个*参数?在排序算法运行时,它经常比较项目以确定它们的“顺序”是否正确,强调单词“项目”中的** s **。 – WhozCraig

+1

我明白,比较函数需要两件事。我的问题是'哪些'有两件事正在传递给比较器,如果可能的话,'如何'。换句话说,作为程序员,我可以期望得到什么作为输入参数,以便我可以决定在lambda内执行什么检查。 – Gautam

+2

@Gautam啊。你可以期待你的序列中的任何东西。何时和如何 - 经常出现的东西完全取决于正在使用的算法。并且我建议您在编写自己的文章之前彻底理解严格 - 弱 - 排序的概念,尤其是在编写基于复杂对象中多个字段值的订单时。 – WhozCraig

回答

5

大多数排序算法的核心是两个元素之间的比较,以确定哪一个应该在另一个之前。例如,这里是快速排序,取自Wikipedia

function quicksort(array) 
    if length(array) ≤ 1 
     return array // an array of zero or one elements is already sorted 
    select and remove a pivot element pivot from 'array' // see '#Choice of pivot' below 
    create empty lists less and greater 
    for each x in array 
     *****if x ≤ pivot then append x to less***** this line here 
     else append x to greater 
    return concatenate(quicksort(less), list(pivot), quicksort(greater)) // two recursive calls 

在该伪码的情况下,比较本

if x ≤ pivot 

注意,这是一个二进制操作中,两个参数被x,和pivot。在标准库函数std::sort的情况下,这将改为:

if (comp(x,pivot)) 

哪里comp是你在通过作为最后一个参数的函子。因此,要回答你的问题:“哪两件事开始传入比较器”,无论该范围中的哪两个元素需要在该算法逻辑的特定时间进行比较。

+0

+1:... perf。 :-) –

+0

谢谢你的答案。另外,我对单参数lambda正确的理解是什么?从这个问题引用:“......如果lambda是一个一元函数,那么它的输入参数就是迭代器当前指向的任何东西......” – Gautam

相关问题