Решил я написать от нечего делать фигню со свистелками и перделками списками и внезапно наткнулся вот на такую радость:


list::rbegin() // Returns an iterator addressing the first element in a reversed list.
list::end() // Returns an iterator that addresses the location succeeding the last element in a list. If the list is empty, then list::end == list::begin.
(c) MSDN

reverse_iterator rbegin()
{ // return iterator for beginning of reversed mutable sequence
return (reverse_iterator(end()));
}
(c) <list>

Остается молиться, что оный rbegin() не используется где-нибудь в шаблонах <algorythm>...


PS: found on MS Visual Studio 2005.


UPD: Порылся в исходниках STL и обнаружил вот такую прелесть:


_RanIt __CLR_OR_THIS_CALL base() const
{ // return wrapped iterator
return (current);
}
reference __CLR_OR_THIS_CALL operator*() const
{ // return designated value
_RanIt _Tmp = current;
return (*--_Tmp);
}
pointer __CLR_OR_THIS_CALL operator->() const
{ // return pointer to class object
return (&**this);
}

То есть, обратный итератор возвращает изображает, будто бы он ссылается на правильный элемент, но при попытке получить обычный итератор вернет не его, а... внезапно итератор, ссылающийся на следующий элемент. Просто прекрасно!



URL записи