2

我刚刚看了STL 的这个关于 STL 的讲座。

在讲座开始大约 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函数的第三个参数。在内部,传递给输入参数“left”和“right”的是什么?

我添加了这一行:

std::cout << "left: " << left << ", right: " << right << std::endl;

在 lambda 体内,我得到的输出是:

左:羚羊 右:猫
左:羚羊 右:猫
左:小狗 右:猫
左:小狗 右:羚羊
左:小狗 右:猫
左:熊 右:猫
左:熊 右:羚羊
左:熊,右:小狗
左:熊,右:
猫猫熊小狗羚羊

所以看起来“左”和“右”参数在某种程度上与内部排序算法有关。谁能更清楚地了解到底发生了什么?

我的理解是,如果 lambda 是一元函数,那么它的输入参数将是迭代器当前指向的任何内容。这个对吗?
但是对于二进制函数,输入参数让我感到困惑。

4

1 回答 1

6

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

请注意,这是一个二元运算,两个参数是xpivot。在标准库函数的情况下std::sort,这将是:

if (comp(x,pivot))

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

于 2013-10-18T23:47:48.800 回答