4

我有一个排序向量数组,

向量<int> b[1000009];

现在我必须在 b[factor] 行中搜索 x 和 y 之间的范围。
'factor'、'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()。所以请告诉我如何在这里实现比较器功能。

4

1 回答 1

5

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将是相同的位置!我们的循环将立即终止,这正是我们想要的,因为我们的范围内没有元素。

于 2014-03-15T03:25:36.333 回答