Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

Abstrakter Iterator из области С++

636  1 2 3 все
ThorV прохожий07.07.12 08:15
ThorV
NEW 07.07.12 08:15 
в ответ ThorV 07.07.12 08:13
кстати, итератор, возвращающий void*, сам по себе весьма занятная конструкция
#21 
ThorV прохожий07.07.12 08:40
ThorV
NEW 07.07.12 08:40 
в ответ Программист 06.07.12 10:42
По поводу FindxxxFile рассмешил. Специализированная операция прохода по списку и итератор. Ню ню. А как без шаблонов реализовать универсальный итератор на c++, чтоб им можно было дереференсировать любые объекты, поделись пожалуйста опытом. reinterpret_cast<MySuperPuperClass>( void* ) рулит?
#22 
anly коренной житель07.07.12 17:56
anly
07.07.12 17:56 
в ответ ThorV 07.07.12 08:40
void* pUniversal;
слово даю на отсечение: итерирует всё!
Проклят нарушающий межи ближнего своего (Втор.27:17)
#23 
Simple Nothing is f*cked07.07.12 21:00
Simple
NEW 07.07.12 21:00 
в ответ anly 07.07.12 17:56
Но через жопу.
#24 
anly коренной житель08.07.12 00:52
anly
NEW 08.07.12 00:52 
в ответ Simple 07.07.12 21:00
через ж-пу разименование. а итерирование ничем не хуже.
Проклят нарушающий межи ближнего своего (Втор.27:17)
#25 
ThorV прохожий08.07.12 01:37
ThorV
NEW 08.07.12 01:37 
в ответ anly 08.07.12 00:52
А при итерации по массиву через что -жопу или тухес?
{}
#26 
anly коренной житель08.07.12 01:51
anly
NEW 08.07.12 01:51 
в ответ ThorV 08.07.12 01:37
а хочь чез что. разници то нет
Проклят нарушающий межи ближнего своего (Втор.27:17)
#27 
Программист знакомое лицо08.07.12 13:21
NEW 08.07.12 13:21 
в ответ Murr 06.07.12 20:51
В ответ на:
Где? Я не вижу ни одной возможности получить этот итератор...

Не понял, в чем проблема?
В ответ на:
class CList : public IIterator
{
public:
IIterator * GetIterator () { return this; }
}

#28 
Murr патриот08.07.12 13:25
Murr
NEW 08.07.12 13:25 
в ответ Программист 08.07.12 13:21
И что? Оно работает? Или все же абстрактный класс не инстанцируется?
#29 
Программист знакомое лицо08.07.12 13:34
NEW 08.07.12 13:34 
в ответ ThorV 07.07.12 08:15
Задача итетатора - пройти по элементам списка.
В ответ на:
Ню ню. А как без шаблонов реализовать универсальный итератор на c++, чтоб им можно было дереференсировать любые объекты, поделись пожалуйста опытом. reinterpret_cast<MySuperPuperClass>( void* ) рулит?

Ну тогда уж dinamic_cast, чтобы проверить на NULL :D
В любом случае, если не хочешь иметь дело с void *, то используй структуру классов. В чем проблема?
Кроме того, шаблонами хорошо описывать алгоритмы без привязки к типам данных, однако при использовании шаблонов ты все равно должен задать тип данных. Стл-список на void * накойже валинный как и на любом другом типе данных. А если у тебя есть структура классов, то ты легко можешь реализовать итератор на этих классах БЕЗ использования шаблонов.
Я не говорю о том насколько это хорошо или плохо (зачем изобретать велосипед, когда есть стл? :D), но все таки итераторы (по своему смыслу) вполне себе могут существовать и без шаблонов.
#30 
Программист знакомое лицо08.07.12 13:36
08.07.12 13:36 
в ответ Murr 08.07.12 13:25
Работает конечно :) Тут же возвращается указатель на абстрактный класс, а не сам абстрактный класс ;)
#31 
Murr патриот08.07.12 17:19
Murr
NEW 08.07.12 17:19 
в ответ Программист 08.07.12 13:36
Тут же возвращается указатель на
-----
Это Я, разумеется, вижу...
Чего Я не вижу - где инстанцируется то, что должно быть возвращено...
Ну и, должно быть очевидно, что писать руками имплементацию итератора каждый раз нет никакого желания...
#32 
  scorpi_ завсегдатай08.07.12 19:30
NEW 08.07.12 19:30 
в ответ Murr 08.07.12 17:19
В ответ на:
Чего Я не вижу - где инстанцируется то, что должно быть возвращено...

return this; там стоит. Это конечно дебилизм - приравнивать контейнер к итератору, но инстанция там есть.
В ответ на:
Ну и, должно быть очевидно, что писать руками имплементацию итератора каждый раз нет никакого желания...

Это было очевидно Абрахамсу уже 10 лет назад, почему он и написал итератор адаптор. На который я выше давал ссылку.
#33 
Murr патриот08.07.12 20:17
Murr
NEW 08.07.12 20:17 
в ответ scorpi_ 08.07.12 19:30
return this; там стоит.
------
Это Я вижу.
Я не вижу имплементации абстрактных методов. Писать их нет желания, а без них этот this бессмысленнен.
я выше давал ссылку
-----
Это не совсем ко мне - это к изобретателям сложных имплементаций давно наработанных решений.
#34 
ThorV прохожий08.07.12 21:23
ThorV
NEW 08.07.12 21:23 
в ответ Программист 08.07.12 13:34
>>Задача итетатора - пройти по элементам списка.
Задача итератора - пройтись по ЛЮБОМУ контейнеру, включая вектор и массив
>>Ну тогда уж dinamic_cast, чтобы проверить на NULL :D
А если у класса нет виртуальных функций, то компилятор шлет такому dynamic_cast большой пианэрский привет
>>В любом случае, если не хочешь иметь дело с void *, то используй структуру классов. В чем проблема?
Извини конечно, но какого ...уя использовать малопривлекательное решение от Явы? Как быть со встроенными типами? Писать оболочки вокруг int/char/float?
#35 
anly коренной житель08.07.12 22:30
anly
NEW 08.07.12 22:30 
в ответ ThorV 08.07.12 21:23
В ответ на:
Задача итератора - пройтись по ЛЮБОМУ контейнеру, включая вектор и массив
мне лично совершенно не понятно ЗАЧЕМ нужна такая вот универсальность?
Универсальность чаще всего идет в конфликте с производительностью или требуемым рессурсам.
Наоборот: каждому контейнеру свой итератор - специализированыый и быстрый и наиболее лучше подходящий.
Ну разве то ради забавы да спортивного интереса...
Проклят нарушающий межи ближнего своего (Втор.27:17)
#36 
ThorV прохожий08.07.12 23:45
ThorV
NEW 08.07.12 23:45 
в ответ anly 08.07.12 22:30
Интерфейс итераторов STL и с++-98 абсолютно универсален и на производительность влияет только реализация. Не нужна универсальность - на кой тогда нужны итераторы вообще? Пиши от руки списки, деревья и прочая, и будет тебе щастье.
#37 
anly коренной житель09.07.12 00:40
anly
NEW 09.07.12 00:40 
в ответ ThorV 08.07.12 23:45
В ответ на:
на кой тогда нужны итераторы вообще?
а чем итерировать без них то?
В ответ на:
Интерфейс итераторов STL и с++-98 абсолютно универсален
как раз там несколько специализированных итераторов для разных контейнеров.
к примеру vector::iterator имеет operator+=(int N), и реализация его считай мгновенная
а list::iterator такового не имеет, в виду того что реализовать его мгновенно (т.е. без перебора N раз) невозможно.
Проклят нарушающий межи ближнего своего (Втор.27:17)
#38 
  scorpi_ завсегдатай09.07.12 01:26
NEW 09.07.12 01:26 
в ответ anly 09.07.12 00:40
В ответ на:
к примеру vector::iterator имеет operator+=(int N), и реализация его считай мгновенная
а list::iterator такового не имеет, в виду того что реализовать его мгновенно (т.е. без перебора N раз) невозможно.

Ну да, лучше как в жабе, где список возвращает итератор случайного доступа...
#39 
  abubakr прохожий09.07.12 07:55
NEW 09.07.12 07:55 
в ответ anly 09.07.12 00:40
В ответ на:

как раз там несколько специализированных итераторов для разных контейнеров.
к примеру vector::iterator имеет operator+=(int N), и реализация его считай мгновенная
а list::iterator такового не имеет, в виду того что реализовать его мгновенно (т.е. без перебора N раз) невозможно.

Вы наверное имели ввиду operator++.
'Мгновенная' реализация, т.е. О(1), заслуга вовсе не итератора, а структуры данных, выбранной для реализации вектора.
Советую немного почитать про STL.
#40 
1 2 3 все