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

时间:2011-02-09 02:47:24

标签: c++ lower-bound

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

来自以下主题:stl ordering - strict weak ordering

我确实理解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;

}

1 个答案:

答案 0 :(得分: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

至于您尝试解决的问题,如果您希望值尽可能接近目标值,那么您实际上不需要在此处使用less_equal。相反,使用lower_bound来获取大于您正在寻找的值的最小元素的迭代器(使用整数上的默认<比较),然后将该值与之前的值进行比较(假设当然,这两个值都存在!)lower_bound的值是最小的元素,至少与x一样大,并且该值之前的元素是不大于x的最大值,因此两个中的一个必须是最接近的。

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