簡體   English   中英

為什么std :: binary_search使用ForwardIterator,而不使用RandomIterator?

[英]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()可以根據需要專門用於不同的迭代器(例如,將ForwardIteratorForwardIterator使用std::distance()std::advance()以及適合實現的其他迭代器技術)。 請記住, BidirectionalRandomAccess迭代器是ForwardIterator

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM