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'
我想知道这种优化(尽管很小)是否真的可行。
答案 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
进行比较。现在,我们要求将其与x
和y
进行分区。这仍然是通过总排序满足,所以你的排序向量将起作用,假设你的<
是理智的(即,它提供了所需的严格弱排序)。