如果你想把“第一”变成“最后”,你有两个选择。首先,您可以使用std::upper_bound,然后取上一个元素(见下文)。二、可以使用reverse iterators:
const auto pos = std::lower_bound(
std::make_reverse_iterator(ic + n),
std::make_reverse_iterator(ic), m, compare);
compare 在哪里
bool compare(int a, int b) {
return b < a;
}
使用此比较器,std::lower_bound() 返回指向不大于(= 小于或等于)m 的第一个元素的迭代器。在反向范围上,这相当于返回指向原始范围中满足此条件的最后一个元素的迭代器。
简单示例:
int ic[] = {1, 3, 3, 5};
// pos
// m = 1 ^
// m = 2 ^
// m = 3 ^
如何修改该搜索条件(将 <= 更改为其他内容)?
std::lower_bound 查找范围内的第一个元素(由比较器划分为 true,...,true,false,...false),比较器返回@987654335 @。如果您的标准可以用这种语言重新表述,您可以使用std::lower_bound。
假设我们有一个范围 1 3 3 5,我们将 < 替换为 <=(您的 compare 版本)。然后我们有:
1 3 3 5
m = 2 T F F F
m = 3 T T T F
m = 4 T T T F
对于m = 3 和m = 4,std::lower_bound 会将迭代器返回到5,即过去最后一个3。换句话说,std::lower_bound 和默认 < 被替换为 <= 正是 std::upper_bound 和默认 < 是什么。您可以将生成的迭代器前移-1 以获取最后一个元素(但请注意本示例中的m = 0 等极端情况)。
如何更改我想要第一个元素还是最后一个元素
它总是返回比较器返回false 的第一个元素。您可以反转范围或查找要查找的元素后面的第一个元素。