lower_bound功能而不创建T元素

时间:2014-06-04 09:12:51

标签: c++ c++11 stl

我有一个T类,它有一个属性(int f() const)。我有一个T的向量,它是根据这个属性排序的。我想对元素执行对数搜索,以找到调用f()不小于输入的第一个元素。

std::vector<T> v;
// Filling of v
int lob = 1234;
// This next line is an illustration of intent:
std::lower_bound(v.begin(),v.end(),lob
  ,/* ??? if(element.f() < lob) return true; */ );

解决方法是创建T的实例,当lob被调用时,该实例将返回f()的值。让我们说创建这样的虚拟T会非常困难。如何在不创建T的情况下执行此搜索?

我可以写这个问题的对数搜索,但我想知道是否有任何通用解决方案。我对C ++ 11解决方案一直感兴趣。

1 个答案:

答案 0 :(得分:3)

在C ++ 11中,您可以将lambda表达式用于比较器:

auto it = std::lower_bound(v.begin(), v.end(), lob,
                           [](T const & x, int n) { return x.f() < n; });

如果您是功能组合风格的粉丝,您还可以使用嵌套的bind表达式:

using std::placeholders::_1;
using std::placeholders::_2;
auto it = std::lower_bound(
    v.begin(), v.end(), lob,
    std::bind(std::less<int>(), std::bind(&T::f, _1), _2));