Re[10]: Проблемы STL-контейнеров
От: kan Великобритания  
Дата: 08.09.06 12:37
Оценка:
Kluev wrote:

> ЮБ>Ты себе представляешь stl без итераторов?

> Цель итераторов — сделать перебор элементов в разных контейнерах
> одинаковым. Это больная идея т.к. контейнеры должны перебиратся наиболее
> нативным для них способом. Как например должен выглядеть итератор для
> многомерных массивов, кольцевых списков и деревьев? Многие контейнеры в
Делается просто — несколько типов итераторов. Классический пример — begin-end/rbegin-rend. Для дерева можно 2 типа
сделать — обход в ширину и обход в глубину.
Т.е. функции, возвращающие итераторы могут быть даже с аргументами, например, задать по какой "кривой" обойти
многомерный массив.

> концепцию итераторов просто не вписываются в результате чего программист

> вынужден пользоватся тем убогим набором который есть в stl. К томуже
> алгоритмы применимы не ко всем контейнерам и фактически единственным
> универсальным алгоритмом который подходит для всех является for_each. Но
> для этого существует более универсальный и могучий паттерн — визитор,
> который:
>
> 1) гораздо проще в реализации чем итератор
> 2) программы с его использованием получаются более элегантными
Требует задания функтора. Всегда. А это не всегда элегантно.
Не позволяет иметь несколько итераторов, позволяющих обходить контейнер в разном порядке одновременно.

> Третье преимущество в том что внутри container.clear(clear_func) пербор

> идет способом родным для контейнера, что существенно упрощает отладку.
Какой способ является родным для дерева? Да даже для того же массива? Почему от начала к концу, а не наоборот? Или с
середины к краям?

> Так же итераторы в стиле stl совершенно не подходят для перебора

> кольцевых контейнеров.
> Т.к. в силу замкнутости их требуется итерировать не в диапазоне [begin,
> end), а в диапазоне [begin, last]
[begin, last] никак не позволяет задавать пустые интервалы, и никак это не обойти, и это является наиболее важным. Тем
более не надо делать замкнутый итератор единственно доступным для контейнера. Пусть это будет обычный std::list, просто
для него создать ещё один тип итератора, который будет замыкаться. Но это не запрещает при необходимости использовать
старые добрые begin/end. Можно написать метод, возвращающий [first, last) для кольцевого контейнера, притом first будет
совпадать с указанным "началом" кольца.

На самом деле есть более интересная абстракция boost::range.
Posted via RSDN NNTP Server 2.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.