我有一个严格按递减顺序排序的数组和一个元素val
;我想找到数组中最大元素的索引,该元素小于val(如果val已经存在,则为相等),并且我想在logn
时间内完成此操作。和执行upper_bound()不是一个选项。
例如,如果数组为{10,5,3,1}而val为6,则函数应返回1。
我对迭代器是个新手,尝试过在upper_bound()中添加比较函数来使其工作,但失败了。我该怎么处理这件事。
注意:我检查了类似的问题之前,张贴和发现了一个,但不幸的是它涉及Java,所以。
只需将upper_bound
与适当的比较函数一起使用:
upper_bound
通常要求顺序递增),因此您需要使用
而不是<
。upper_bound
通常排除它),因此您需要使用>=
而不是仅仅使用>
。.
int data[] = {10,5,3,1};
auto item = std::upper_bound(std::begin(data), std::end(data), 6,
[](int a, int b) { return a >= b; });
现在您只需将结果迭代器转换为索引(在检查其有效之后):
if (item != std::end(data)) {
auto index = std::distance(std::begin(data), item);
std::cout << index << std::endl;
}
else
std::cout << "not found" << std::endl;
使用upper_bound()
,它将比较函数作为第四个参数。