由于元素已排序,因此可以使用二分搜索来查找匹配元素。 C++ 标准库有一个std::lower_bound
可用于此目的的算法。为了清晰和简单起见,我建议将其包装在您自己的二分搜索算法中:
/// Performs a binary search for an element
///
/// The range `[first, last)` must be ordered via `comparer`. If `value` is
/// found in the range, an iterator to the first element comparing equal to
/// `value` will be returned; if `value` is not found in the range, `last` is
/// returned.
template <typename RandomAccessIterator, typename Value, typename Comparer>
auto binary_search(RandomAccessIterator const first,
RandomAccessIterator const last,
Value const& value,
Comparer comparer) -> RandomAccessIterator
{
RandomAccessIterator it(std::lower_bound(first, last, value, comparer));
if (it == last || comparer(*it, value) || comparer(value, *it))
return last;
return it;
}
(C++ 标准库有一个std::binary_search
,但它返回一个bool
: true
如果范围包含该元素,false
否则。如果您想要元素的迭代器,则它没有用。)
一旦你有了元素的迭代器,你就可以使用std::distance
计算范围内元素索引的算法。
这两种算法在任何随机访问序列上都同样有效,包括std::vector
和普通数组。