如何在排序向量中找到下限

kee*_*ety 2 c++ lower-bound

我是C++的新手,并不了解STL库的所有概念,所以请耐心等待.我编写了以下代码片段(粘贴在下面),以便在排序向量中找到lower_bound.尽管此代码在Release模式下工作正常,但它在调试模式(VStudio-8)中断言.我相信这是因为less_equal<int>不是一个严格的弱序.

从以下线程:stl排序 - 严格弱排序

我有点明白,STL会强加弱序,但我还不清楚为什么?

在我的情况下,我需要使用,less_equal<int>因为我试图找到排序向量中给定值的最近元素.

下面的代码片段是否有效?还有,有更好的方法吗?此外,任何关于弱和部分排序的见解/参考都会有所帮助.

int main() {

  vector<int> dest;
  for(int i = 0;i <6;i++) {

     dest.push_back(i);
  }

  vector<int>::iterator i = 
  std::lower_bound(dest.begin(),dest.end(),4,less_equal< int >());

  return 1;

}
Run Code Online (Sandbox Code Playgroud)

tem*_*def 9

STL使用严格的弱排序,因为给定SWE(让我们表示它<),您可以定义所有六个关系运算符:

x <  y      iff     x <  y
x <= y      iff   !(y <  x)
x == y      iff   !(x <  y || y <  x)
x != y      iff    (x <  y || y <  x)
x >= y      iff   !(x <  y)
x >  y      iff     y <  x
Run Code Online (Sandbox Code Playgroud)

至于你想要解决的问题,如果你想让值尽可能接近目标值,你真的不需要在less_equal这里使用.相反,使用lower_bound获取一个大于你正在寻找的值的最小元素的迭代器(使用<整数的默认比较),然后将该值与它之前的值进行比较(当然,假设这两个值都存在! )from lower_bound是最小元素,至少与x一样大,而该值之前的元素是不大于x的最大值,因此两者中的一个必须是最接近的.

至于为什么程序在断言,很可能是因为这<=不是一个严格的弱序,但我不能确定.更改为使用上述方法应该修复它,除非问题来自其他来源.