编辑:文件太多了,使我感到困惑.问题是我得到了相同的迭代器.我通过从lower_bound返回值减去1来解决它.我用它进行插值:
float operator()(double f) { SpectrumPoint* l=std::lower_bound(beginGet(),endGet(),(SpectrumPoint){float(f),0.0f},SpectrumPoint::CompareFreqLessThan); if(l>beginGet()) {--l;} SpectrumPoint* u=std::lower_bound(beginGet(),SpectrumPoint::CompareFreqLessThan); if(u==endGet()) {u=beginGet();} if(l==u) { if(u==endGet()) {return u->amp;} return l->amp; } double f_min=l->freq; double A_min=l->amp; double f_max=u->freq; double A_max=u->amp; double delta_f=f_max-f_min; double delta_A=A_max-A_min; return A_min + delta_A*(f-f_min)/delta_f; }
我很抱歉这个混乱:-(
low_bound是什么意思如果我不得不猜测我会回答这个函数返回的迭代器的最后一个元素小于要求的值.但是我看到lower_bound与upper_bound几乎相同.唯一的区别是在upper_bound的情况下是严格的不等式. stl中是否存在真正的下界选择功能,与下界的正常定义一致.
解决方法
>下限:大于或等于的第一个元素.
>上限:第一个要严格要大的元素.
>上限:第一个要严格要大的元素.
例:
+- lb(2) == ub(2) +- lb(6) +- lb(8) | == begin() | == ub(6) | +- ub(8) == end() V V V V +---+---+---+---+---+---+---+---+---+---+---+ | 3 | 4 | 4 | 4 | 4 | 5 | 7 | 7 | 7 | 7 | 8 | +---+---+---+---+---+---+---+---+---+---+---+ ^ ^ ^ | | | +- lb(4) +- ub(4) +- lb(9) == ub(9) == end() |- eq-range(4) -|
正如你所看到的,n的半开等距范围是[lb(n),ub(n)).
请注意,两个界限都可以为期望值的元素提供有意义的插入位置,以便维护排序,但lower_bound具有区别特征,即如果该元素已经存在,那么您将获得一个实际指向该元素的迭代器.因此,您可以在有序范围上使用lower_bound来实现您自己的唯一成员或多成员容器.
void insert(Container & c,T const & t) { auto it = std::lower_bound(c.begin(),c.end(),t); // if unique container: if (it != c.end() && *it == t) { /* error,element exists! */ return; } c.insert(it,t); }