Login
Abstrakter Iterator из области С++
NEW 07.07.12 08:15
in Antwort ThorV 07.07.12 08:13
NEW 07.07.12 08:40
in Antwort Программист 06.07.12 10:42
По поводу FindxxxFile рассмешил. Специализированная операция прохода по списку и итератор. Ню ню. А как без шаблонов реализовать универсальный итератор на c++, чтоб им можно было дереференсировать любые объекты, поделись пожалуйста опытом. reinterpret_cast<MySuperPuperClass>( void* ) рулит?
NEW 07.07.12 17:56
in Antwort ThorV 07.07.12 08:40
void* pUniversal;
слово даю на отсечение: итерирует всё!
слово даю на отсечение: итерирует всё!
Проклят нарушающий межи ближнего своего (Втор.27:17)
NEW 08.07.12 00:52
in Antwort Simple 07.07.12 21:00
через ж-пу разименование. а итерирование ничем не хуже.
Проклят нарушающий межи ближнего своего (Втор.27:17)
NEW 08.07.12 01:37
in Antwort anly 08.07.12 00:52
NEW 08.07.12 01:51
in Antwort ThorV 08.07.12 01:37
NEW 08.07.12 13:21
Не понял, в чем проблема?
in Antwort Murr 06.07.12 20:51
В ответ на:
Где? Я не вижу ни одной возможности получить этот итератор...
Где? Я не вижу ни одной возможности получить этот итератор...
Не понял, в чем проблема?
В ответ на:
class CList : public IIterator
{
public:
IIterator * GetIterator () { return this; }
}
class CList : public IIterator
{
public:
IIterator * GetIterator () { return this; }
}
NEW 08.07.12 13:25
in Antwort Программист 08.07.12 13:21
И что? Оно работает? Или все же абстрактный класс не инстанцируется?
NEW 08.07.12 13:34
in Antwort ThorV 07.07.12 08:15
Задача итетатора - пройти по элементам списка.
Ну тогда уж dinamic_cast, чтобы проверить на NULL :D
В любом случае, если не хочешь иметь дело с void *, то используй структуру классов. В чем проблема?
Кроме того, шаблонами хорошо описывать алгоритмы без привязки к типам данных, однако при использовании шаблонов ты все равно должен задать тип данных. Стл-список на void * накойже валинный как и на любом другом типе данных. А если у тебя есть структура классов, то ты легко можешь реализовать итератор на этих классах БЕЗ использования шаблонов.
Я не говорю о том насколько это хорошо или плохо (зачем изобретать велосипед, когда есть стл? :D), но все таки итераторы (по своему смыслу) вполне себе могут существовать и без шаблонов.
В ответ на:
Ню ню. А как без шаблонов реализовать универсальный итератор на c++, чтоб им можно было дереференсировать любые объекты, поделись пожалуйста опытом. reinterpret_cast<MySuperPuperClass>( void* ) рулит?
Ню ню. А как без шаблонов реализовать универсальный итератор на c++, чтоб им можно было дереференсировать любые объекты, поделись пожалуйста опытом. reinterpret_cast<MySuperPuperClass>( void* ) рулит?
Ну тогда уж dinamic_cast, чтобы проверить на NULL :D
В любом случае, если не хочешь иметь дело с void *, то используй структуру классов. В чем проблема?
Кроме того, шаблонами хорошо описывать алгоритмы без привязки к типам данных, однако при использовании шаблонов ты все равно должен задать тип данных. Стл-список на void * накойже валинный как и на любом другом типе данных. А если у тебя есть структура классов, то ты легко можешь реализовать итератор на этих классах БЕЗ использования шаблонов.
Я не говорю о том насколько это хорошо или плохо (зачем изобретать велосипед, когда есть стл? :D), но все таки итераторы (по своему смыслу) вполне себе могут существовать и без шаблонов.
08.07.12 13:36
in Antwort Murr 08.07.12 13:25
Работает конечно :) Тут же возвращается указатель на абстрактный класс, а не сам абстрактный класс ;)
NEW 08.07.12 17:19
in Antwort Программист 08.07.12 13:36
Тут же возвращается указатель на
-----
Это Я, разумеется, вижу...
Чего Я не вижу - где инстанцируется то, что должно быть возвращено...
Ну и, должно быть очевидно, что писать руками имплементацию итератора каждый раз нет никакого желания...
-----
Это Я, разумеется, вижу...
Чего Я не вижу - где инстанцируется то, что должно быть возвращено...
Ну и, должно быть очевидно, что писать руками имплементацию итератора каждый раз нет никакого желания...
NEW 08.07.12 19:30
return this; там стоит. Это конечно дебилизм - приравнивать контейнер к итератору, но инстанция там есть.
Это было очевидно Абрахамсу уже 10 лет назад, почему он и написал итератор адаптор. На который я выше давал ссылку.
in Antwort Murr 08.07.12 17:19
В ответ на:
Чего Я не вижу - где инстанцируется то, что должно быть возвращено...
Чего Я не вижу - где инстанцируется то, что должно быть возвращено...
return this; там стоит. Это конечно дебилизм - приравнивать контейнер к итератору, но инстанция там есть.
В ответ на:
Ну и, должно быть очевидно, что писать руками имплементацию итератора каждый раз нет никакого желания...
Ну и, должно быть очевидно, что писать руками имплементацию итератора каждый раз нет никакого желания...
Это было очевидно Абрахамсу уже 10 лет назад, почему он и написал итератор адаптор. На который я выше давал ссылку.
NEW 08.07.12 20:17
in Antwort scorpi_ 08.07.12 19:30
return this; там стоит.
------
Это Я вижу.
Я не вижу имплементации абстрактных методов. Писать их нет желания, а без них этот this бессмысленнен.
я выше давал ссылку
-----
Это не совсем ко мне - это к изобретателям сложных имплементаций давно наработанных решений.
------
Это Я вижу.
Я не вижу имплементации абстрактных методов. Писать их нет желания, а без них этот this бессмысленнен.
я выше давал ссылку
-----
Это не совсем ко мне - это к изобретателям сложных имплементаций давно наработанных решений.
NEW 08.07.12 21:23
in Antwort Программист 08.07.12 13:34
>>Задача итетатора - пройти по элементам списка.
Задача итератора - пройтись по ЛЮБОМУ контейнеру, включая вектор и массив
>>Ну тогда уж dinamic_cast, чтобы проверить на NULL :D
А если у класса нет виртуальных функций, то компилятор шлет такому dynamic_cast большой пианэрский привет
>>В любом случае, если не хочешь иметь дело с void *, то используй структуру классов. В чем проблема?
Извини конечно, но какого ...уя использовать малопривлекательное решение от Явы? Как быть со встроенными типами? Писать оболочки вокруг int/char/float?
Задача итератора - пройтись по ЛЮБОМУ контейнеру, включая вектор и массив

>>Ну тогда уж dinamic_cast, чтобы проверить на NULL :D
А если у класса нет виртуальных функций, то компилятор шлет такому dynamic_cast большой пианэрский привет

>>В любом случае, если не хочешь иметь дело с void *, то используй структуру классов. В чем проблема?
Извини конечно, но какого ...уя использовать малопривлекательное решение от Явы? Как быть со встроенными типами? Писать оболочки вокруг int/char/float?
NEW 08.07.12 22:30
Универсальность чаще всего идет в конфликте с производительностью или требуемым рессурсам.
Наоборот: каждому контейнеру свой итератор - специализированыый и быстрый и наиболее лучше подходящий.
Ну разве то ради забавы да спортивного интереса...
in Antwort ThorV 08.07.12 21:23
В ответ на:
Задача итератора - пройтись по ЛЮБОМУ контейнеру, включая вектор и массив
мне лично совершенно не понятно ЗАЧЕМ нужна такая вот универсальность?Задача итератора - пройтись по ЛЮБОМУ контейнеру, включая вектор и массив
Универсальность чаще всего идет в конфликте с производительностью или требуемым рессурсам.
Наоборот: каждому контейнеру свой итератор - специализированыый и быстрый и наиболее лучше подходящий.
Ну разве то ради забавы да спортивного интереса...

Проклят нарушающий межи ближнего своего (Втор.27:17)
08.07.12 23:45
in Antwort anly 08.07.12 22:30
Интерфейс итераторов STL и с++-98 абсолютно универсален и на производительность влияет только реализация. Не нужна универсальность - на кой тогда нужны итераторы вообще? Пиши от руки списки, деревья и прочая, и будет тебе щастье.
NEW 09.07.12 00:40
к примеру vector::iterator имеет operator+=(int N), и реализация его считай мгновенная
а list::iterator такового не имеет, в виду того что реализовать его мгновенно (т.е. без перебора N раз) невозможно.
in Antwort ThorV 08.07.12 23:45
В ответ на:
на кой тогда нужны итераторы вообще?
а чем итерировать без них то?на кой тогда нужны итераторы вообще?
В ответ на:
Интерфейс итераторов STL и с++-98 абсолютно универсален
как раз там несколько специализированных итераторов для разных контейнеров.Интерфейс итераторов STL и с++-98 абсолютно универсален
к примеру vector::iterator имеет operator+=(int N), и реализация его считай мгновенная
а list::iterator такового не имеет, в виду того что реализовать его мгновенно (т.е. без перебора N раз) невозможно.
Проклят нарушающий межи ближнего своего (Втор.27:17)
NEW 09.07.12 01:26
Ну да, лучше как в жабе, где список возвращает итератор случайного доступа...
in Antwort anly 09.07.12 00:40
В ответ на:
к примеру vector::iterator имеет operator+=(int N), и реализация его считай мгновенная
а list::iterator такового не имеет, в виду того что реализовать его мгновенно (т.е. без перебора N раз) невозможно.
к примеру vector::iterator имеет operator+=(int N), и реализация его считай мгновенная
а list::iterator такового не имеет, в виду того что реализовать его мгновенно (т.е. без перебора N раз) невозможно.
Ну да, лучше как в жабе, где список возвращает итератор случайного доступа...

NEW 09.07.12 07:55
Вы наверное имели ввиду operator++.
'Мгновенная' реализация, т.е. О(1), заслуга вовсе не итератора, а структуры данных, выбранной для реализации вектора.
Советую немного почитать про STL.
in Antwort anly 09.07.12 00:40
В ответ на:
как раз там несколько специализированных итераторов для разных контейнеров.
к примеру vector::iterator имеет operator+=(int N), и реализация его считай мгновенная
а list::iterator такового не имеет, в виду того что реализовать его мгновенно (т.е. без перебора N раз) невозможно.
как раз там несколько специализированных итераторов для разных контейнеров.
к примеру vector::iterator имеет operator+=(int N), и реализация его считай мгновенная
а list::iterator такового не имеет, в виду того что реализовать его мгновенно (т.е. без перебора N раз) невозможно.
Вы наверное имели ввиду operator++.
'Мгновенная' реализация, т.е. О(1), заслуга вовсе не итератора, а структуры данных, выбранной для реализации вектора.
Советую немного почитать про STL.