Обратите внимание, этот код был написан не мной. Иначе я бы не задавал этот вопрос. Полный кредит идет на Джерри Коффин . В любом случае код генерирует последовательность чисел путем перегрузки std :: iterator <>.
Сначала я опубликую код, а затем объясню, что я вижу. Если бы эксперт C ++ мог исправить меня, если я ошибаюсь, я был бы очень признателен.
Код
static const int N = 10;
template <class T>
class sequence : public std::iterator<std::forward_iterator_tag, T>
{
private:
T val;
public:
sequence(T init) : val(init) { }
T operator *( ) { return val; }
sequence &operator++( ) { ++val; return *this; }
bool operator != ( const sequence &other ) { return val != other.val; }
};
void foo( )
{
typedef std::vector<int> graph;
graph id1( gen_seq(0), gen_seq( N ) );
display( id1 ); /* Not declared */
}
/* displays: 0 1 2 3 4 5 6 7 8 9 */
Итак, глядя на это, я вижу, что вы создаете класс, который содержит значение. Теперь мы передаем два из них в конструктор вектора, который может занять два итератора. Теперь каждый раз, когда конструктор вектора использует оператор ++ в «последовательности», он увеличивает значение внутри итератора. Технически, вы могли бы написать:
graph id1( gen_seq( 0 ), gen_seq( 0 ) );
и это будет генерировать ту же последовательность правильно? Или это оператор! =, Который проверяет, чтобы 0 не перешел на N. Любой вход в этом случае очень помог бы. Я только что закончил читать 3-е издание Страуструпа «Язык программирования С ++», в котором он коснулся итераторов, однако наследование от них не было большой темой и кое-чем, что я не до конца понимаю. Вроде как я бы выполнил все его упражнения, потому что я помню, как он несколько раз просил перегрузить итератор.