我的数学函数越来越多,例如y = x + 5*x^3 + x^7 + 11*ln x
,我希望找到第一个(正数)x
,y(x) >= 1478
。
我可以使用stl的二进制搜索算法来解决这个问题吗?
答案 0 :(得分:2)
问题是,STL算法(std::lower_bound
可能是您选择的候选者)处理集合。或者更具体:关于集合的迭代器。
将它们用于解决问题的一种方法是使用适配器:您编写了一个“迭代器”'它只是在解除引用时返回函数值。
由于您需要满足RandomAccessIterator的所有要求,因此代码可能非常大。但是你可以在你的功能上模板化它。例如:
template<class F>
FuncIterator{
typedef int ParamType;
typedef float ResultType; // Or better: result_of F
ParamType param_;
FuncIterator(ParamType param): param_(param){}
ResultType operator*(){ return F(param_); }
FuncIterator& operator+=(int diff){ param_ += diff; return *this; }
//... Other functions required for RandomAccessIterator
}
auto result = std::lower_bound(FuncIterator<MyFunc>(0), FuncIterator<MyFunc>(1000));
std::cout << "First x value is:" result.param_ << std::endl;
再说一遍:迭代器比这里显示的更复杂,但你应该从这里得到更多。您需要一些定义和可能的特征。但是您只需要定义一次,并且可以将其重用于任何功能。如果你使用std traits来推断param的类型和F
的结果,它会变得更通用。
最后说明:二进制搜索仅搜索范围!所以你在调用std::lower_bound
时必须决定这个范围。它无法找到x
&#39;的第一个值F(x)>=y
对于任何 x,但仅限于给定范围内的任何x。