watashiwa_daredeska писал(а): ↑21.11.2007 18:41
То же самое я могу сказать и про ваш вариант. Но это совсем другая проблема -- описание
смысла слова на другом языке. Так что, не будем больше об этом.
Ваш вариант трактовки:
(sergio) писал(а):Итератор - это повторитель, перебиратель. Поинтер, способный указывать на очередной элемент множества и сдвигаться на следующий элемент того же множества, или быть принудительно связан с любым другим.
Отличается не так уж сильно. Я позволил себе выделить в цитате место, которое, на мой взгляд, к повторению и перебору не имеет никакого отношения.
К перебору - не имеет. Просто в си++ итератор не привязан к множеству пожизненно, можете его связать с другим (совместимым), больше ничего.
Чтобы закончить с "неизвестными специалистами", могу предложить общеизвестную "трактовку" итератора в си++ для ясности: "Итератор - это то, что может быть использовано, как итератор."
На самом деле, проблема итераторов C++ именно в их перегруженности функционалом.
Пример итератора из Си++:
что вы называете перегруженностью функционалом?
В результате, в C++ цель получить "итератор вообще" не достигнута, зато разведен бардак с кучей итераторов, обладающих разными возможностями.
Перечитайте выше "общеизвестное определение из си++". Я что-то не понимаю, о каком "еще более вообще" итераторе вы мечтаете?? А разных итераторов с стандартной библиотеке всего пять категорий. Да и из тех... истрим_итератор вообще-то дефектный... Так что где вы нашли кучу итераторов - тоже уточнить бы. Все остальные "итераторы" подпадают под одну из категорий, и многие из них никто в жизни не видит и в явной форме не создает.
Поясняю еще раз:
watashiwa_darede... писал(а): ↑21.11.2007 11:15
что-то вроде шелловского: command | grep pattern | sort | uniq.
но для объектов. Еще бы аналог tee не помешал. Если интересно, могу продемонстрировать решение этой задачки для, например, Python, но в отдельной ветке -- создайте, если вам действительно интересно.
Сорт-уник к итераторам отношения не имеют - ни к плюсовым, ни к вашим правильным. Это алгоритмы. Соответственно, остается что? комманд - это источник данных, т.е. бегин и енд, греп - фильрующий итератор. Но следом идет сорт, значит нам все равно нужно отдельное множество, оптимизированное для сортировки. Следом из этого множества мы удаляем дубликаты. Итак:
Код: Выделить всё
std::list<T> command;
std::vector<T> out;
// и три строки кода на все:
std::copy_if(command.begin(), command.end(), std::back_inserter(out), & grep);
std::sort(out.begin(), out.end());
std::unique_copy(out.begin(), out.end(), std::ostream_iterator<T>(std::cout, ","));
При многократном юзании оформляете в функцию.
И что, вы и вправду для такого случая стали бы собирать "просто и легко производный итератор"??? ну вы даете... (фигеет)
И еще мну не вполне понимает, как этот производный итератор будет сортировать? уник сделать как фильтрующий итер понятно, а вот сортировка не вполне...
Вот-вот. Проблема C++-итераторов как раз в том, что они -- "пойнтер". По хорошему, итератор -- это НЕ пойнтер.
Это не
по-хорошему, это
по-вашему. Что не тождественно.

А в си++ итератор есть то, что ведет себя как итератор. Где вы видели более общее определение-то? Расскажите наконец. )))
Про "недеструктивно использовано" и "(N+1)!" не понял, если честно.
Есть там оговорка, что удалять элементы из множества надо с оглядкой... больше ничего. А про факториал я сглючил, там не факториал а ((N + 1) ^ 2) /2 или как-то так получается. Так вы кстати не ответили на вопрос, как я должен правильными итераторами на одном списке объектов пометить для себя дюжину другую нужным мне подмножеств???
За счет простоты создания производных итераторов достигается гораздо большая гибкость. Нафига мне какой-то мифический (N+1)! последовательностей?
Вам нафига, а мне нужны. С неправильными итераторами я их имею, а вы покажите как я их с правильными получу. Потому что если никак - то и итераторы ваши никакие не правильные, а кошкин хвост, вот.
Мне нужны вполне определенные: скажем, итератор обхода дерева в ширину, итератор обхода дерева в глубину (которых, как и деревьев, к слову, в std нет), и простые, но гибкие способы создания производных итераторов.
Хватит голословия. Вы пока одну задачу поставили - я ее решил элементарно и без всякой зауми и ненужной писанины с производными итераторами. Вы мою - вообще не смогли решить. Сперва дайте хоть какой-нибудь ответ - потом дальше пойдем.
А деревьев нет в стандарте, значит они есть в других библиотеках. Раз нет в стандарте - то о чем тогда тут говорить? Какие претензии к стандарту? И кто вам, скажите на милость, мешает в дереве иметь методы, возвращающие те и другие итераторы для обхода так и для обхода этак? Или создать несколько классов, способных обходить дерево так или этак, реализую контракт итератора? Не пробовали? - попробуйте. Мне кажется, должно получиться...