Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Итераторы и алгоритмы


Автор: Ramamba 31.3.2009, 10:29
Есть следующая проблема: написан свой контейнер (подобие листа) и итератор для него. Перегружены все операторы, требуемые для итератора произвольного доступа за исключением "->". Теперь надо сделать так, чтобы с этим итератором мог работать стандартный алгоритм (например, find_if). Не могли бы подсказать, наличие каких методов ожидается от итератора. Буду рад и просто ссылке на какой-нибудь ресурс,  где такая проблема поднимается или хорошей книжке.

PS Задание состоит в том, что бы всё написать с нуля, поэтому такой выход, как наследование от std::iterator не рассматривается.

Автор: korbian 31.3.2009, 11:12
повтори интерфейс стандартного list (информация здесь: http://www.cplusplus.com/reference/stl/list/), реализуй под него Итератор (суть паттерна можно посмотреть тут: http://ooad.asf.ru/Pattern.aspx?IdKat=7&IdPat=35). если все реализуешь правильно, работать будет. будут сложности приводи код!!!

Автор: vinter 31.3.2009, 11:28
Цитата(Ramamba @  31.3.2009,  11:29 Найти цитируемый пост)
Не могли бы подсказать, наличие каких методов ожидается от итератора.

operator *
operator ->
operator =
operator ++
operator ++(int)
operator --(int)
operator <
operator !=
operator ==

вроде достаточно

Автор: Daevaorn 31.3.2009, 11:33
Цитата(Ramamba @  31.3.2009,  11:29 Найти цитируемый пост)
Перегружены все операторы, требуемые для итератора произвольного доступа за исключением "->"

Цитата(Ramamba @  31.3.2009,  11:29 Найти цитируемый пост)
Не могли бы подсказать, наличие каких методов ожидается от итератора.

http://www.kuzbass.ru:8086/docs/isocpp/lib-iterators.html#lib.iterator.requirements

Автор: Ramamba 31.3.2009, 14:47
спасибо, буду копать)

Автор: maxim1000 31.3.2009, 16:18
ещё можно посмотреть boost::iterator_facade
даже если его не использовать, можно будет посмотреть список того, что он предоставляет

Автор: Ramamba 31.3.2009, 22:02
ЕЕЕ парни, спасибо вам. Особенно тебе, Daevaorn. 
Покопался в этой документации, добавил в итератор тайпдефов
Код

            typedef T& reference;
            typedef T* pointer;
            typedef long difference_type;
            typedef T value_type;
            typedef std::random_access_iterator_tag iterator_category;

и всё заработало. Алгоритм find_if выбрал из моего листа всё, что надо

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)