std::equal_range实现优化:复用lower_bound结果是否安全?
关于std::equal_range优化实现的安全性疑问
cppreference网站给出了std::equal_range的一种简化实现:
template<class ForwardIt, class T> std::pair<ForwardIt, ForwardIt> equal_range(ForwardIt first, ForwardIt last, const T& value) { return std::make_pair(std::lower_bound(first, last, value), std::upper_bound(first, last, value)); }
疑问:为什么std::upper_bound要从first重新开始遍历,而不是复用std::lower_bound的结果?比如可以改成下面的优化实现:
template<class ForwardIt, class T> std::pair<ForwardIt, ForwardIt> equal_range(ForwardIt first, ForwardIt last, const T& value) { ForwardIt lower = std::lower_bound(first, last, value); return std::make_pair(lower, std::upper_bound(lower, last, value)); }
显然重复检查[first, lower)区间是多余的,因为upper_bound要找的元素必然处于[lower, last)区间内。已知cppreference提供的是简化示例而非经过极致优化的版本,现在想确认这种简单优化是否安全,有没有像空数组这类没考虑到的边界情况?不追求极致性能,只需要确认该优化的安全性。
更新:有评论建议用libc++库的测试用例来验证这个优化实现的正确性。
内容的提问来源于stack exchange,提问作者Damir Tenishev
相关产品推荐
相关产品推荐

