我知道谓词从迭代器的输入范围中获取参数并按预期进行操作,但是当我们提供一个二元谓词和一对迭代器时,它是如何工作的?容器的元素如何传递给谓词?
例如std::sort
默认情况下按字母顺序对字符串 vector 进行排序,但要根据大小对它们进行排序,我们可以传递如下谓词:
sort(vec.begin(), vec.end(), [](const string &a, const string &b) {
return a.size() < b.size();
});
所以,这应该按大小而不是按字母顺序对字符串 vector vec
进行排序,但我无法理解这是如何发生的,即谓词如何将 vector 的元素作为参数以及它是如何排序的?
最佳答案
当调用 std sort 时,该函数的“正常”版本将使用 operator<
执行一些比较。正如您所理解的,两个字符串之间的比较是字典顺序的(就像字典一样)。
然而,开发std::sort
的人函数考虑如下情况:
- 没有
operator<
- 用户可能想要另一种排序方式
这就是谓词有用的地方。谓词(如 Igor Tandetnik 所说)在 std::sort
内部调用。功能。
所以,对于普通版本,std::sort
会做类似的事情:
if(*a < *b) {
...
}
在谓词版本中,它的作用几乎相同:
if(predicate(*a, *b)) {
...
}
这样一来,您的谓词将替换 operator<
功能。
关于c++ - 使用谓词根据大小排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45643415/