使用lower_bound的结果作为upper_bound的参数(反之亦然)

时间:2015-09-25 17:02:26

标签: c++ lower-bound

lower_bound返回可以插入元素的排序向量中的最小位置,而不会丢失已排序的顺序属性。 upper_bound,最大值。考虑到这一点,是否有任何边缘情况:

auto lower = std::lower_bound(vec.begin(), vec.end(), x);
auto upper = std::upper_bound(lower, vec.end(), y); // using lower, as opposed to vec.begin()
for (auto it = lower; it != upper; it++) { /* do work */ }

不会按预期执行?也就是说,不会访问范围[x,y)中的每个元素,其中x< Y'

我想知道这种优化(尽管很小)是否真的可行。

1 个答案:

答案 0 :(得分:1)

tl; dr - 是的,没关系。

对于您的原始问题(上限和下限都在搜索相同的键x),它已经内置为std::equal_range

特别注意段落

  

返回的范围由两个迭代器定义,一个指向第一个不小于value的元素,另一个指向第一个大于value的元素。 第一个迭代器可以使用std::lower_bound()获得,第二个使用std::upper_bound() 获得。

对于已编辑的问题 - lower_bound(x) .. upper_bound(y)x <= y,前提条件稍有变化。

原始版本仅要求输入范围分区x进行比较。现在,我们要求将其与xy进行分区。这仍然是通过总排序满足,所以你的排序向量将起作用,假设你的<是理智的(即,它提供了所需的严格弱排序)。