Здравствуйте, Юнусов Булат, Вы писали:
ЮБ>Здравствуйте, 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;
// .....
}