[英]Why does std::binary_search use ForwardIterator, not RandomIterator?
我很驚訝它在使用不支持auto middle = first + (last - first) / 2;
ForwardIterator時如何計算middle
auto middle = first + (last - first) / 2;
。
當然,即使它不是隨機迭代器,您也可以計算元素的數量。
如果它是一個隨機迭代器,你可以只得到它在一定時間內last - first
,如果沒有,至少你可以提前first
通過一個一個,直到last
,並以線性復雜度得到計數。
應該實現的是根據iterator標簽進行分派,這是std::advance
圖像示例,展示了如何根據迭代器的類型進行分派:
template <class InputIterator, class Distance>
inline void __advance(InputIterator& i, Distance n,
input_iterator_tag)
{
while (n--) ++i;
}
template <class ForwardIterator, class Distance>
inline void __advance(ForwardIterator& i, Distance n,
forward_iterator_tag)
{
advance(i, n, input_iterator_tag());
}
template <class BidiectionalIterator, class Distance>
inline void __advance(BidiectionalIterator& i, Distance n,
bidirectional_iterator_tag)
{
if (n >= 0)
while (n--) ++i;
else
while (n++) --i;
}
template <class RandomAccessIterator, class Distance>
inline void __advance(RandomAccessIterator& i, Distance n,
random_access_iterator_tag)
{
i += n;
}
template <class InputIterator, class Distance>
inline void advance(InputIterator& i, Distance n)
{
__advance(i, n, iterator_traits<InputIterator>::iterator_category());
}
std::binary_search()
的行為在概念上等效於(對於非比較器版本)
template <class ForwardIterator, class T>
bool binary_search (ForwardIterator first, ForwardIterator last, const T& val)
{
first = std::lower_bound(first,last,val);
return (first!=last && !(val<*first));
}
其中std::lower_bound()
可以根據需要專門用於不同的迭代器(例如,將ForwardIterator
和ForwardIterator
使用std::distance()
和std::advance()
以及適合實現的其他迭代器技術)。 請記住, Bidirectional
和RandomAccess
迭代器是ForwardIterator
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.