c++ - 使用谓词根据大小排序

标签 c++ sorting stl predicate

我知道谓词从迭代器的输入范围中获取参数并按预期进行操作,但是当我们提供一个二元谓词和一对迭代器时,它是如何工作的?容器的元素如何传递给谓词?

例如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的人函数考虑如下情况:

  1. 没有operator<
  2. 用户可能想要另一种排序方式

这就是谓词有用的地方。谓词(如 Igor Tandetnik 所说)在 std::sort 内部调用。功能。

所以,对于普通版本,std::sort会做类似的事情:

if(*a < *b) {
...
}

在谓词版本中,它的作用几乎相同:

if(predicate(*a, *b)) {
...
}

这样一来,您的谓词将替换 operator<功能。

关于c++ - 使用谓词根据大小排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45643415/

相关文章:

c++ - 使用GLM加载obj文件

java - 如何使用 LMAX 破坏器查找数组中的最大元素

php - 从数组中删除值高于/低于阈值的项目

将值添加到 .h 中的映射时出现 C++ 错误

c++ - 为什么 std::ends 会导致字符串比较失败?

c++ - Lambda 函数作为类成员

c++ - 实例化派生类的类的复制构造函数

c++ - 禁用 Qt 3d 中的所有光源

javascript - Node.js - 首先对从字母开始且长度较长的字符串进行排序,然后是从小到大的数字开始的字符串

c++ - STL 中的继承问题