【问题标题】:How to find a lower bound in a sorted vector如何在排序向量中找到下限
【发布时间】:2011-02-09 02:47:24
【问题描述】:

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

来自以下线程:stl ordering - strict weak ordering

我确实理解 STL 强加了弱排序,但我仍然不太清楚为什么?

在下面的例子中,我需要使用less_equal<int>,因为我试图在排序向量中找到最接近给定值的元素。

下面的代码 sn-p 是否有效?另外,有没有更好的方法呢?此外,任何关于什么是弱排序和偏序的见解/参考都会有所帮助。

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;

}

【问题讨论】:

    标签: c++ lower-bound


    【解决方案1】:

    STL 使用严格的弱排序,因为给定一个 SWE(我们将其表示为 &lt;),您可以定义所有六个关系运算符:

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

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

    【讨论】:

    • 感谢它现在对我来说更有意义,正如你所说,我没有充分的理由坚持 less_equal:)
    猜你喜欢
    • 2013-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-26
    • 1970-01-01
    • 1970-01-01
    • 2012-08-13
    相关资源
    最近更新 更多