Iterator operation
对应cppreference iterator operation。在阅读akrzemi1 Value semantics的时候,其中对比了std::next、std::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::prev、std::next
reference semantic:std::advance
i = next(i, 1); // value semantic
advance(i, 1); // reference semantic
advance(i, 1)
是pass-by-reference,在它的内部能够就地修改。