在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() ]
我有一个排序好的向量数组,
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。所以lb
和ub
是相同的位置!循环将立即终止,这正是我们想要的,因为在我们的范围内没有元素。
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- C++:TypeDef使用元组
- 使用std::multimap迭代器创建std::list
- 从不同线程使用int64的不同字节安全吗
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 为什么在全局范围内使用"extern int a"似乎不行?
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用Google Mock来模拟gettimeofday()
- 如何使用默认参数等选择模板专业化
- 为什么使用 "this" 指针调用派生成员函数?
- 使用新行和不使用新行读取文件
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 如何确定我已使用非编码文件到达 EOF?
- 如何在cuSparse中使用cusparseXcoo2csr从coo转换为csc
- 使用CMake创建QML插件
- 使用strcpy将char数组的元素复制到另一个数组
- 在c++中使用nlohmann从类到json的转换
- 使用指针从C++中的数组中获取最大值
- 使用多个文件时"array bound is not an integer constant before ']' token"