2

我对 C++ 很陌生,不了解 STL 库的所有概念,所以请耐心等待。我编写了以下代码片段(粘贴在下面)来查找排序向量中的 lower_bound。尽管此代码在发布模式下工作正常,但它在调试模式下断言(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;

}
4

1 回答 1

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获取大于您要查找的值的最小元素的迭代器(使用<整数的默认比较),然后将该值与它之前的值进行比较(当然,假设这两个值都存在! ) from 的值lower_bound是与 x 一样小的最小元素,而在该值之前的元素是不大于 x 的最大值,因此两者中的一个必须是最接近的。

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

于 2011-02-09T02:53:06.133 回答