Re[9]: Проблемы STL-контейнеров
От: Kluev  
Дата: 08.09.06 12:09
Оценка: 1 (1) -2
Здравствуйте, Юнусов Булат, Вы писали:

ЮБ>Здравствуйте, Kluev, Вы писали:


kan>>>В общем, какие-то надуманные проблемы, чаще всего возникающие от недопонимания понятия "итератор".


K>>Итераторы — это костыли и грабли под видом красивой идеи. Для массивов — лучше юзать индексы, для интрузивных node-based контейнеров достаточно знать указатель на элемент. Лишние сущности не нужны.


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


Цель итераторов — сделать перебор элементов в разных контейнерах одинаковым. Это больная идея т.к. контейнеры должны перебиратся наиболее нативным для них способом. Как например должен выглядеть итератор для многомерных массивов, кольцевых списков и деревьев? Многие контейнеры в концепцию итераторов просто не вписываются в результате чего программист вынужден пользоватся тем убогим набором который есть в stl. К томуже алгоритмы применимы не ко всем контейнерам и фактически единственным универсальным алгоритмом который подходит для всех является for_each. Но для этого существует более универсальный и могучий паттерн — визитор, который:

1) гораздо проще в реализации чем итератор
2) программы с его использованием получаются более элегантными

сравни
for_each(container.begin(), container.end(), clear_func);
container.clear();

и
container.clear(clear_func);


Третье преимущество в том что внутри container.clear(clear_func) пербор идет способом родным для контейнера, что существенно упрощает отладку.

Так же итераторы в стиле stl совершенно не подходят для перебора кольцевых контейнеров.
Т.к. в силу замкнутости их требуется итерировать не в диапазоне [begin, end), а в диапазоне [begin, last]

Elem *p, *last; // если p == last делаем полный круг
for (bool ok = true; ok; p = next(p)) 
{
   ok = p != last;
   // .....
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.