在排序的向量上替代std :: find_if和std :: bind2nd

时间:2019-04-18 14:11:15

标签: c++

我有一个日期类GregorianDate和一个std::vector<GregorianDate>实例dates。该向量已排序。

当前,给定一个GregorianDate实例date,我得到了表达式

std::vector<GregorianDate>::const_iterator it = std::find_if(
    dates.begin(),
    dates.end(),
    std::bind2nd(std::greater<GregorianDate>(), date)
);

我很乐意将其替换为

std::vector<GregorianDate>::const_iterator it = 
    std::lower_bound(dates.begin(), dates.end(), date);

因为不推荐使用bind2nd并对dates进行了排序。

对于任何date,两个表达式的结果是否相同?

1 个答案:

答案 0 :(得分:3)

结果不一样。 std::lower_bound为您提供集合中第一个大于或等于您要寻找的元素的元素,如果没有,则最后一个元素。另一方面,std::find_if将仅返回比较器返回true的元素,而std::greater如果元素相等则不会返回true。

您需要使用std::upper_bound来匹配对find_if的调用(upper_bound返回的第一个元素大于要查找的元素),或在{{ 1}}以匹配find_if的工作方式。