在c++中搜索排序向量中的范围[x,y][使用lower_bound()和upper_bound()]

Searching for a range [x,y] in a sorted vector in C++ [using lower_bound() and upper_bound() ]

本文关键字:bound 使用 lower upper 排序 搜索 c++ 向量 范围      更新时间:2023-10-16

我有一个排序好的向量数组,

vector 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()。请告诉我如何实现比较器函数

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 9

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

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

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

如果x=5 y=6呢?在这个范围内没有值。它会做什么?

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