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