С++ для начинающих




Пример связанного списка - часть 13


        insert_end( pt->value() );

        pt = pt->next();

    }

}

после чего копирующий конструктор и оператор присваивания можно реализовать так:

inline ilist::ilist( const ilist &rhs )

    : _at_front( 0 ), _at_end( 0 )

    { insert_all ( rhs ); }

inline ilist&

ilist::operator=( const ilist &rhs ) {

    remove_all();

    insert_all( rhs );

    return *this;

}

Теперь осталось обеспечить пользователя возможностью путешествовать по списку, например с помощью доступа к члену _at_front:

ilist_item *ilist::front() { return _at_front(); }

После этого можно применить ilist_item::next(), как мы делали в функциях-членах:

ilist_item *pt = mylist.front();

while ( pt ) {

    do_something( pt->value() );

    pt = pt->next();

}

Хотя это решает проблему, лучше поступить иначе: реализовать общую концепцию прохода по элементам контейнера. В данном разделе мы расскажем об использовании цикла такого вида:

for ( ilist_item *iter = mylist.init_iter();

      iter;

      iter = mylist.next_iter() )

        do_something( iter->value() );

(В разделе 2.8 мы уже касались понятия итератора. В главах 6 и 12 будут рассмотрены итераторы для имеющихся в стандартной библиотеке контейнерных типов и обобщенных алгоритмов.)

Наш итератор представляет собой несколько больше, чем просто указатель. Он должен уметь запоминать текущий элемент, возвращать следующий и определять, когда все элементы кончились. По умолчанию итератор инициализируется значением _at_front, однако пользователь может задать в качестве начального любой элемент списка. next_iter() возвращает следующий элемент или 0, если элементов больше нет. Для реализации пришлось ввести дополнительный член класса:

class ilist {

public:

    // ...

    init_iter( ilist_item *it = 0 );

private:  

    //...

    ilist_item *_current;

};

init_iter() выглядит так:

inline ilist_item*

ilist::init_iter( i1ist_item *it )

{

    return _current = it ? it : _at_front;

}

next_iter() перемещает указатель _current на следующий элемент и возвращает его адрес, если элементы не кончились. В противном случае он возвращает 0 и устанавливает _current в 0. Его реализацию можно представить следующим образом:




Содержание  Назад  Вперед