![](/img/trans.png)
[英]using lower_bound or upper_bound on Structure in C++
[英]Searching for a range [x,y] in a sorted vector in C++ [using lower_bound() and upper_bound() ]
我有一组排序的矢量,
vector <int> b [1000009];
现在我必须在行b [因子]中搜索x和y之间的范围。
'factor','x'和'y'都是整数。
我使用了以下approch:
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 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.所以lb
和ub
将是相同的位置! 我们的循环会立即终止,这正是我们想要的,因为我们的范围内没有元素。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.