假设我想在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);
但是我得到了非法的间接错误。
答案 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
);