Я пишу специальный класс итератора, который работает как std::istream_iterator
и многие другие, используя созданный по умолчанию экземпляр для обозначения конца итерации. Я хочу дать ему двунаправленную категорию итератора. После запуска следующего кода:
MyIterType i_cur(get_some_iter()), i_end;
while(i_cur != i_end) ++i_cur;
Стандартные требования для двунаправленных итераторов налагают следующее, чтобы быть действительными?
--i_cur
++i_cur
--i_end
или же ++i_end
Спасибо за цитирование стандарта, если это возможно. Я компилирую в C ++ 03, но если C ++ 11 вводит изменения, мне также интересно их знать.
Стандарт говорит, что ответ на ваш вопрос — да:
Table 75—Bidirectional iterator requirements (in addition to forward iterator)
expression return type operational assertion/note
semantics pre/post-coindition
======== ============ ============ ====================
--r X& pre: there exists s such
that r == ++s.
post: s is dereferenceable.
--(++r) == r.
--r == --s implies r
== s.
&r == &--r
В 24.2.6 в C ++ 11 в таблице 110 приведены дополнительные требования для двунаправленного итератора.
В частности, если существует s
такой, что r == ++s
, затем --r
должен быть действительным, и в результате r
должен быть разыменованным. К тому же:
--(++r) == r
,--r == --s
подразумевает r == s
,&r == &--r
,Так что, если начальный i_cur
вернулся get_some_iter
последний итератор, последний i_cur
имеет предшественника и поэтому должен быть уменьшаемым. То же самое относится и к i_end
, так как он является преемником финала i_cur
,