iterator_traits<Iterator>::difference_type iterator_traits<Iterator>::value_type iterator_traits<Iterator>::iterator_categorybe defined as the iterator's difference type, value type and iterator category, respectively.
iterator_traits<Iterator>::reference iterator_traits<Iterator>::pointershall be defined as the iterator's reference and pointer types, that is, for an iterator object a, the same type as the type of *a and a->, respectively.
iterator_traits<Iterator>::difference_type iterator_traits<Iterator>::value_type iterator_traits<Iterator>::reference iterator_traits<Iterator>::pointermay be defined as void.
using difference_type = typename Iterator::difference_type; using value_type = typename Iterator::value_type; using pointer = typename Iterator::pointer; using reference = typename Iterator::reference; using iterator_category = typename Iterator::iterator_category;Otherwise, iterator_traits<Iterator> shall have no members by any of the above names.
namespace std {
template<class T> struct iterator_traits<T*> {
using difference_type = ptrdiff_t;
using value_type = remove_cv_t<T>;
using pointer = T*;
using reference = T&;
using iterator_category = random_access_iterator_tag;
};
}
template<class BidirectionalIterator>
void reverse(BidirectionalIterator first, BidirectionalIterator last) {
typename iterator_traits<BidirectionalIterator>::difference_type n =
distance(first, last);
--n;
while(n > 0) {
typename iterator_traits<BidirectionalIterator>::value_type
tmp = *first;
*first++ = *--last;
*last = tmp;
n -= 2;
}
}