【发布时间】:2023-03-23 16:28:01
【问题描述】:
lower_bound 是什么意思。如果我不得不猜测,我会回答这个函数在最后一个小于请求值的元素处返回迭代器。但我看到lower_bound 几乎和upper_bound 一样。唯一的区别是在 upper_bound 的情况下严格不等式。 stl中是否有真正的下限选择函数与下限的正常定义一致。
编辑:文档中有太多的否定让我感到困惑。问题是我得到了相同的迭代器。我通过从 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(),endGet(),(SpectrumPoint){float(f),0.0f}
,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;
}
我很抱歉造成这种混乱:-(
【问题讨论】:
-
你在问为什么它返回迭代器 after 边界(保证存在,由于使用半开范围的 C++ 约定),而不是迭代器before 边界(不保证存在)?或者你对界限应该在哪里有其他想法?
-
我不太明白这不是一个真正的问题。同意没有问号,但文本中似乎存在一些有效的担忧。
-
是的,名称不正确。一个更好的名字是
least_upper_bound,但这可能会让大多数没有数学头脑的人感到困惑。数学上正确的lower_bound函数模板必须返回一个反向迭代器。这将远不如当前将前向迭代器返回到最小上限的方案有用。该函数的名称在技术上不正确,但仍然有意义。 -
请为这个问题付出一些努力:给它一个meaningful title,并编辑正文以将问题表达为正确的英语(包括问号!)。这个问题当然有道理,但糟糕的表述可能会让人们望而却步。
-
我觉得这个标题很有用。我非常困惑并在脑海中重复标题(但带有问号)。
标签: c++ math stl naming-conventions