【问题标题】:Searching for a range [x,y] in a sorted vector in C++ [using lower_bound() and upper_bound() ]在 C++ 中的排序向量中搜索范围 [x,y] [使用 lower_bound() 和 upper_bound() ]
【发布时间】:2014-03-15 02:51:49
【问题描述】:

我有一个排序向量数组,

向量 b[1000009];

现在我必须在 b[factor] 行中搜索 x 和 y 之间的范围。
“因子”、“x”和“y”都是整数。
我使用了以下方法:

        int lb,ub;
        if(b[factor][0]>=x){lb=0;}
        else
            {
                lb=upper_bound(b[factor].begin(),b[factor].end(),x)-b[factor].begin();
                while(b[factor][lb-1]>=x)lb--;
            }
        if(b[factor][sz2-1]<=y)
            {
                ub=sz2-1;
            }
        else {
                ub=lower_bound(b[factor].begin(),b[factor].end(),y)-b[factor].begin();
                while(b[factor][ub]>y)ub--;
            }

但是这种方法并不是一直都能给出正确的答案。除此之外,我还想使用一些比较器功能来实现相同的目的。这是我第一次使用 lower_bound()upper_bound()。所以请在这里告诉我如何实现比较器功能。

【问题讨论】:

  • 你的向量排序了吗?
  • @vaughn- 是的,它们已经排序了,我忘了说。
  • 你能举一个你得到错误答案的例子吗?
  • 我有一个 146 行的程序,我在其中使用了这个代码段,当我运行它时,它给了我运行时错误。当我通过循环暴力检查替换它时,它运行良好。所以这里一定有什么错误?
  • 什么是有效的蛮力等效项?

标签: c++ stl lower-bound


【解决方案1】:

std::lower_bound 返回值大于或等于参数的第一个元素的位置。 std::upper_bound 返回大于参数的第一个元素的位置。您可以使用这些来迭代 x 和 y 之间的值范围,如下所示:

  auto vb = b[factor].begin();
  auto ve = b[factor].end();
  auto lb = lower_bound(vb,ve,x);
  auto ub = upper_bound(vb,ve,y);
  for (auto i=lb; i!=ub; ++i) {
    // Do something with *i
  }

让我们举这个例子。假设我们的向量包含这些值:

1 3 4 7 9

假设 x=3 和 y=7。 std::lower_bound(vb,ve,x) 将返回第一个大于或等于 3 的值的位置。由于存在一个等于 3 的值,所以它的位置就是我们将得到的下限位置。

std::upper_bound(vb,be,y) 将返回大于 7 的第一个值的位置。在这种情况下,这将是 9 的位置。

所以我们的循环是从位置 3 到但不包括位置 9,这正是我们想要的值的范围。

现在如果 x=5 和 y=6 会怎样。该范围内不会有任何值。它会做什么?

第一个大于等于 5 的值是 7。第一个大于 6 的值也是 7。所以lbub 是同一个位置!我们的循环将立即终止,这正是我们想要的,因为我们的范围内没有元素。

【讨论】:

  • lower_boundupper_bound 的描述起初似乎有点令人困惑,尤其是因为它们非常相似。但是,一旦您了解了它们应该如何使用,它就真的很简单了。
  • 我们不需要任何比较器功能吗?这里的函数是 = not > 和
  • @dhruv: std::lower_boundstd::upper_bound 正在为您进行比较。
  • 如果我们的向量中没有元素 b/w x 和 y,你能告诉我 lb 和 ub 会有什么吗?
  • @dhruv:这样的话lb和ub会在同一个位置,循环会立即停止。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多