Glоbus wrote:
>
> Pzz>Пусть это оценивают знатоки C++
>
> Pzz>Я к их числу не принадлежу...
>
> Не понял — а как же вы, уважаемый, оцениваете решения, предложенные
> кандидатами?
Ну хорошо, если Вы так настаиваете, я оценю Вашу программу. Но оценю не
очень высоко...
1. Я просил подсчитать локальные максимумы в массиве. Не в C++'ном
контейнере, а именно в массиве. Т.е., задание понято неверно.
Теперь, раз уж Вы сделали обобщенное решение, давайте поговорим о нем.
2. Ваше решение требует прямой "ссылки" на последний элемент
последовательности. Это очень жесткое ограничение. Чтобы найти последний
элемент, в общем случае требуется просмотреть последовательность до
конца, а потом перемотать ее в начало. Это не всегда возможно, и не
всегда легко. Например, Ваш алгоритм невозможно использовать для
последовательности чисел, которые приходят из сети, и которых слишком
много, чтобы удерживать их в памяти. Содержательно Вам это ограничение
не нужно, задача решается путем однократного просмотра
последовательности от начала до конца.
Интересно, что человеку, который ничего не понимает в C++'ных
итераторах, но хоть немного понимает в алгоритмах, это бросается в глаза
сразу. Из этого можно сделать вывод, что компутерная наука еще не
достигла такого состояния, когда можно собирать программы из готовых
компонентов, не задумываясь, что у этих компонентов внутри (и достигнет
ли? Не является ли идея компонентного программирования вредной иллюзией?).
4. На ту же тему — Вам нужно уметь отматывать последовательность назад
(--last_it). Не для всякой последовательности это возможно или легко, и
это тоже совершенно избыточное требование.
5. Насколько я понял, val_it должен ссылаться на текущий элемент
последовательности, prev_it — на предыдущий, и next_it — на следующий за
ним. Однако prev_it Вы инкрементируете только один раз, в самом начале.
6. У Вас слишком много переменных, без которых можно было бы обойтись.
Вы заводите переменную nCurr, только для того, чтобы (неправильно!)
контролировать, когда Вы можете инкрементировать prev_it, и переменную
last_it, чтобы контролировать, докуда можно инкрементировать next_it.
Обе эти переменные излишни, и только усложняют код.
7. Ваша программа сломается на последовательности из одного элемента:
++next_it вначале программы сделает next_it равным end_it, после чего Вы
попробуете воспользоваться значением *next_id.
8. Вообще, Ваше решение чрезмерно усложнено. Такой код трудно понимать,
и трудно поддерживать.
Posted via RSDN NNTP Server 2.0