【问题标题】:Using comparator in upper_bound STL在 upper_bound STL 中使用比较器
【发布时间】:2020-08-09 17:26:15
【问题描述】:

我正在尝试制作一个程序,该程序使 最后一个元素 小于或等于我们的给定值。

根据lower_bound的定义,它给出第一个大于或等于传递给定键值的元素。我创建了一个比较器函数

bool compare(int a, int b) {
    return a <= b;
}

这是在我的下界函数中传递的:

int largest_idx = lower_bound(ic, ic + n, m, compare)

在执行时,它给了我最后一个小于等于我的 m(键值)的元素。这不是与 lower_bound 的工作方式相反吗?下限应该给我比较的第一个值还是比较器实际上改变了它?

【问题讨论】:

  • [ic, ic + n)代表增加或减少范围?
  • 递增范围

标签: c++ stl comparator


【解决方案1】:

如果你想把“第一”变成“最后”,你有两个选择。首先,您可以使用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          ^

如何修改该搜索条件(将 &lt;= 更改为其他内容)?

std::lower_bound 查找范围内的第一个元素(由比较器划分为 true,...,true,false,...false),比较器返回@987654335 @。如果您的标准可以用这种语言重新表述,您可以使用std::lower_bound。

假设我们有一个范围 1 3 3 5,我们将 &lt; 替换为 &lt;=(您的 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 和默认 &lt; 被替换为 &lt;= 正是 std::upper_bound 和默认 &lt; 是什么。您可以将生成的迭代器前移-1 以获取最后一个元素(但请注意本示例中的m = 0 等极端情况)。

如何更改我想要第一个元素还是最后一个元素

它总是返回比较器返回false 的第一个元素。您可以反转范围或查找要查找的元素后面的第一个元素。

【讨论】:

  • 这个比较器实际上是如何适应 lower_bound() 函数的,我认为它只会改变查找第一个元素的标准
  • 我想知道的是,比较器通常如何适应 lower_bound 程序。关于如何修改 lower_bound() 中的比较函数,我真的很头疼
  • @shawnindamnen,你所说的“适合”是什么意思?
  • 对不起,如果我不清楚,我只想知道比较器函数实际上如何影响 lower_bound(),就像一般它搜索大于或等于的第一个元素给它。如何修改该搜索条件(将
【解决方案2】:

比较器不能检查相等,使用小于。

此外,数据应该已经排序或至少必须根据比较器进行分区。

参见。 https://www.cplusplus.com/reference/algorithm/lower_bound/

【讨论】:

  • 范围不能排序,必须通过比较器进行分区。这是一个较弱的要求。对于整数,&lt; 和 &lt;= 都是有效的分区函数。
猜你喜欢
  • 2012-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多