std :: lower_bound上的boost :: bind或boost :: lambda

时间:2012-01-26 18:54:19

标签: c++ boost

假设我想在std :: vector指针上使用std :: lower_bound,如下所示:

struct X {
    int x;
    double y;
};

// overloads for normal comparisons
bool operator< (int left, const X& right) { return left < right.x; }
bool operator< (const X& left, int right) { return left.x < right; }

std::vector<X*> v;

int searchValue = 5;
std::vector<X*>::iterator it = std::lower_bound(v.begin(), v.end(), searchValue,
    ? // what the heck do I put here?
);

我会在这里使用boost :: bind或boost :: lambda吗?若然,怎么做?

我认为会是这样的:

std::lower_bound(v.begin(), v.end(), searchValue, searchValue < *_1);

但是我得到了非法的间接错误。

2 个答案:

答案 0 :(得分:0)

尝试以下

struct MyLessThan
{
   bool operator()( const X* xVal, int iVal )
   {
      return xVal->x < iVal;
   }
};

std::vector<X*> v;

int searchValue = 5;
std::vector<X*>::iterator it = std::lower_bound(v.begin(), v.end(), searchValue, MyLessThan() );

这应该有效。

答案 1 :(得分:0)

经过一些试验和错误后得到了它。 Boost.Bind在这里不起作用,编译器会因使用占位符而感到困惑。 Boost.Bind在匿名根命名空间中使用_1。 Boost.Lambda在命名空间boost :: lambda :: _ 1下使用它。

另外,我在比较中输错了。

#include <boost/lambda/lambda.hpp>

// ...

std::vector<X*>::iterator it = std::lower_bound(v.begin(), v.end(), searchValue,
    *boost::lambda::_1 < searchValue
);