lower_bound功能,而不创建T元素

lower_bound functionality without creating T element

本文关键字:创建 元素 bound 功能 lower      更新时间:2023-10-16

我有一个T类,它有一个属性(int f() const(。我有一个向量Ts,它是关于这个性质排序的。我想对元素进行对数搜索,以找到调用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的实例,该实例将在调用其f()时返回lob的值。假设像这样创建一个伪T会非常困难。如何在不创建T的情况下执行此搜索?

我可以为这个问题编写对数搜索,但我想知道是否有任何通用的解决方案。我对C++11之前和之后的解决方案也很感兴趣。

在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));
相关文章: