Skip to content

Iterator operation

对应cppreference iterator operation。在阅读akrzemi1 Value semantics的时候,其中对比了std::nextstd::advance

cppreference std::advance

cppreference std::prev

cppreference std::next

cppreference std::distance

C++17 implementation

对比Second version和First version,可以发现两种实现,其实都是tag dispatch,即根据iterator的iterator_category来选择不同的实现。

// implementation via constexpr if, available in C++17
template<class It>
constexpr typename std::iterator_traits<It>::difference_type
    distance(It first, It last)
{
    using category = typename std::iterator_traits<It>::iterator_category;
    static_assert(std::is_base_of_v<std::input_iterator_tag, category>);

    if constexpr (std::is_base_of_v<std::random_access_iterator_tag, category>) // random access iterator
        return last - first;
    else { // 其他的iterator
        typename std::iterator_traits<It>::difference_type result = 0;
        while (first != last) {
            ++first;
            ++result;
        }
        return result;
    }
}

使用 std::distance 的优势

在 artima On the Tension Between Object-Oriented and Generic Programming in C++ 中给出的例子说明了使用 std::distance 的优势,概括起来是:

1、program to abstraction and polymorphism

Value semantic and reference semantic

在akrzemi1 Value semantics 的Why we use value semantics段,使用value semantic and reference semantic分析iterator operation,下面总结了使用value semantic and reference semantic来分析上述几种operation:

value semantic:std::prevstd::next

reference semantic:std::advance

i = next(i, 1); // value semantic
advance(i, 1);  // reference semantic

advance(i, 1)是pass-by-reference,在它的内部能够就地修改。