我刚看了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;
}
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,它会按照长度的递增顺序打印向量中的字符串.我的问题是关于lambda表达式,它是sort函数的第三个参数.在内部,传递给输入参数'left'和'right'的是什么?
我添加了这一行:
std::cout << "left: " << left << ", right: " << right << std::endl;
Run Code Online (Sandbox Code Playgroud)
在lambda的主体里面,我得到的输出是:
左:羚羊,右:猫
左:羚羊,右:猫
左:小狗,右:猫
左:小狗,右:羚羊
左:小狗,右:猫
左:熊,右:猫
左:熊,右:羚羊
左:熊,右:小狗
离开:熊,右:猫猫
小狗羚羊
所以看起来"左"和"右"的参数在某种程度上与内部排序算法有关.任何人都可以更清楚地知道究竟发生了什么?
我的理解是,如果lambda是一个一元函数,那么它的输入参数将是迭代器当前指向的任何东西.它是否正确?
但是使用二进制函数,输入参数会让我困惑.
大多数排序算法的核心是两个元素之间的比较,以确定哪个元素应该在另一个元素之前.例如,这里是quicksort,取自维基百科.
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
Run Code Online (Sandbox Code Playgroud)
在这种伪代码的情况下,比较就是这样
if x ? pivot
Run Code Online (Sandbox Code Playgroud)
请注意,这是一个二进制操作,两个参数是x,和pivot.在标准库函数的情况下std::sort,这将是:
if (comp(x,pivot))
Run Code Online (Sandbox Code Playgroud)
comp作为最后一个参数传入的仿函数在哪里.所以,回答你的问题:"哪两个东西开始传入比较器",无论该范围的2个元素需要在算法逻辑中的特定时间进行比较.