c++ - 如何使用upper_bound找出满足某个条件的最后一个变量
问题描述
我正在尝试使用 log(n) 方法来找出满足特定条件的最后一个变量。我查看了文档并在算法部分找到了这些(http://www.cplusplus.com/reference/algorithm/)
二分搜索(在分区/排序范围上操作):
lower_bound:将迭代器返回到下限(函数模板)
upper_bound:将迭代器返回到上限(函数模板)
equal_range:获取相等元素的子范围(函数模板)
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(), a.end(), 3, check));
}
但由于在这种情况下check
只是默认的小于操作,您可以完全忽略它。
int main() {
int c;
sort(a.begin(), a.end());
c = distance(a.begin(), upper_bound(a.begin(), a.end(), 3));
}
请参阅此处的参考
推荐阅读
- php - 在 Laravel 5 中将工厂传递到另一个工厂
- php - PHPMailer 在本地移动客户端阅读器上显示接收/发送的电子邮件时,电子邮件显示不正确?
- bash - Presto 查询的简单批处理脚本
- python - Flask RestPlus:添加预期的标题和模型
- c# - C# 调用 Magento soap 服务端点绑定不使用 HTTP?
- angular - Angular 5中我的表格的粘性标题
- excel - 让 VBA 循环遍历 Outlook 中的所有收件箱,包括共享收件箱
- c# - Specify proper route to call a WebApi 2 Controller method
- java - 将两个对象列表合并到 Map 中,其值为 java 8 中的不同对象
- javascript - 在异步函数中调用异步函数时事务完成错误