问题描述
我正在尝试使用log(n)方法来找出满足特定条件的最后一个变量。我查看了文档,发现 这些在算法部分(http://www.cplusplus.com/reference/algorithm/)
二进制搜索(对分区范围/排序范围进行操作):
lower_bound:将迭代器返回到下限(函数模板)
upper_bound:将迭代器返回到上限(函数模板)
binary_search:测试值是否按排序顺序(功能模板)存在
我想做我想做的事,应该使用upper_bound / lower_bound。
在这种情况下,我试图找出小于或等于3的数字的最后一个索引。(3)。我知道有更简单的方法,例如遍历整个数组,但是我想学习如何使用upper_bound。我知道比较器需要2个数字,但是我不需要2个数字,所以我不确定该怎么做。
#include <bits/stdc++.h>
using namespace std;
vector<int> a = {0,1,2,3,4,5};
bool check(int base) {
if (a.at(base) <= 3) {
return true;
}
return false;
}
int main() {
int c;
sort(a.begin(),a.end());
c = distance(a.begin(),upper_bound(a.begin(),a.end(),check));
cout<<c;
return 0;
}
我如何正确地做到这一点?
解决方法
比较器将您要搜索的3
的数字与向量中的数字进行比较。这就是为什么它需要两个参数的原因。当您应该将数字3
作为参数传递给upper_bound
时,您已经在比较器中进行了硬编码。
这也是对向量进行排序的函数,因此,如果要使用向量,还应将其传递给sort
。
您的代码可能看起来像这样
bool check(int x,int y) {
return x < y;
}
int main() {
int c;
sort(a.begin(),a.end(),check);
c = distance(a.begin(),upper_bound(a.begin(),3,check));
}
但是由于在这种情况下check
只是默认的小于操作,因此您可以完全省略它。
int main() {
int c;
sort(a.begin(),a.end());
c = distance(a.begin(),3));
}
请参见参考文献here