Random access to an element.
reverse_iterator operator+(Distance, reverse_iterator) Random Access Iterator Iterator addition. This is a global function, not a member function.
Distance operator-(const reverse_iterator&, const reverse_iterator&) Random Access Iterator Finds the distance between two iterators. This is a global function, not a member function.
bool operator==(const reverse_iterator&, const reverse_iterator&) Trivial Iterator Compares two iterators for equality. This is a global function, not a member function.
bool operator<(const reverse_iterator&, const reverse_iterator&) Random Access Iterator Determines whether the first argument precedes the second. This is a global function, not a member function.
random_access_iterator_tag iterator_category(const reverse_iterator&) Iterator tags Returns the iterator's category. This is a global function, not a member function.
T* value_type(const reverse_iterator&) Iterator tags Returns the iterator's value type. This is a global function, not a member function.
Distance* distance_type(const reverse_iterator&) Iterator tags Returns the iterator's distance type. This is a global function, not a member function.
New members

These members are not defined in the Random Access Iterator requirements, but are specific to reverse_iterator.

Member Description
self A typedef for reverse_iterator<RandomAccessIterator, T, Reference, Distance>.
RandomAccessIterator base() Returns the current value of the reverse_iterator's base iterator. If ri is a reverse iterator and i is any iterator, the two fundamental identities of reverse iterators can be written as reverse_iterator(i).base() == i and &*ri == &*(ri.base() – 1).
reverse_iterator(RandomAccessIterator i) Constructs a reverse_iterator whose base iterator is i.
Notes

[1] There isn't really any good reason to have two separate classes: this separation is purely because of a technical limitation in some of today's C++ compilers. If the two classes were combined into one, then there would be no way to declare the return types of the iterator tag functions iterator_category, distance_type and value_type correctly. The iterator traits class solves this problem: it addresses the same issues as the iterator tag functions, but in a cleaner and more flexible manner. Iterator traits, however, rely on partial specialization, and many C++ compilers do not yet implement partial specialization. Once compilers that support partial specialization become more common, these two different reverse iterator classes will be combined into a single class.

[2] The declarations for rfirst and rlast are written in this clumsy form simply as an illustration of how to declare a reverse_iterator. Vector is a Reversible Container, so it provides a typedef for the appropriate instantiation of reverse_iterator. The usual way of declaring these variables is much simpler:

vector<T>::reverse_iterator rfirst = rbegin();

vector<T>::reverse_iterator rlast = rend();

[3] Note the implications of this remark. The variable rfirst is initialized as reverse_iterator<…> rfirst(V.end());. The value obtained when it is dereferenced, however, is *(V.end() – 1). This is a general property: the fundamental identity of reverse iterators is &*(reverse_iterator(i)) == &*(i – 1). This code sample shows why this identity is important: if [f, l) is a valid range, then it allows [reverse_iterator(l), reverse_iterator(f)) to be a valid range as well. Note that the iterator l is not part of the range, but it is required to be dereferenceable or past-the-end. There is no requirement that any such iterator precedes f.

See also
Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату