使用谓词根据大小排序

时间:2017-08-11 20:38:16

标签: c++ sorting stl predicate

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

E.g。 std::sort默认按字母顺序对字符串向量进行排序,但要根据大小对它们进行排序,我们可以传递谓词,如:

sort(vec.begin(), vec.end(), [](const string &a, const string &b) {
    return a.size() < b.size();
});

所以,这应该按字母大小排序字符串vec的向量,而不是按字母顺序排序,但是我不能理解这是如何发生的,即谓词如何将向量的元素作为参数它是如何排序的?

1 个答案:

答案 0 :(得分:2)

当调用std sort时,&#34; normal&#34;此函数的版本将使用operator<执行一些比较。就像你理解的那样,两个字符串之间的比较是词典(如字典)。 但是,开发std::sort函数的人会考虑以下情况:

  1. 没有operator<
  2. 用户可能想要另一种方式对其进行排序
  3. 这是谓词有用的地方。谓词(如Igor Tandetnik所说)在std::sort函数内部调用。

    因此,对于普通版本,std::sort将执行类似的操作:

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

    在谓词版本中,它几乎会做同样的事情:

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

    这样,您的谓词会替换operator<函数。