Здравствуйте, minorlogic, Вы писали:
M>Здравствуйте, skeptik_, Вы писали:
_>>ЗЫ У меня получился за 3 минуты почти один в один std::max_element.
M>Интереснее было бы если бы вы привели тут итоговый код
Да пожалуйста. Разница с msvc 9.0 в том, что у них условие заключает в себя цикл, а у меня стоит в начале (это я уже потом посмотрел)
template< typename ForwardIterator >
ForwardIterator max( ForwardIterator first, ForwardIterator last )
{
if ( first == last )
return first;
ForwardIterator result = first;
while( ++first != last )
if ( *result < *first )
result = first;
return result;
}
А можно всё таки огласить архитектурную ошибку?
Re[10]: Почему преждевременная оптимизация - корень всех зол
Здравствуйте, minorlogic, Вы писали:
M>А если подумать это очень несложный алгоритм, по сравнению с сортировкой просто дет сад. Хотите проверить ? попробуйте сразу после прочтения поста написать за 5 минут такую функцию.
Вот как-то так, наверное. Под рукой сейчас только Eclipse.
static int find(int[] a) throws Exception
{
if (a == null)
throw new NullPointerException("Array is empty");
if (a.length == 0)
throw new IndexOutOfBoundsException("length is 0");
if (a.length == 1)
return a[0];
int max = a[0];
for (int i = 1; i < a.length; i++)
{
if (a[i] > max)
max = a[i];
}
return max;
}
Re[9]: Почему преждевременная оптимизация - корень всех зол?
P> static int find(int[] a) throws Exception
P> {
P> if (a == null)
P> throw new NullPointerException("Array is empty");
P> if (a.length == 0)
P> throw new IndexOutOfBoundsException("length is 0");
P> if (a.length == 1)
P> return a[0];
P> int max = a[0];
P> for (int i = 1; i < a.length; i++)
P> {
P> if (a[i] > max)
P> max = a[i];
P> }
P> return max;
P> }
P>
Явку знаю плохо , поэтому прокоментируй плиз.
P> if (a == null) P> throw new NullPointerException("Array is empty");
А разве такое поведенеи не будет если проверки не делать ? при первом же обращении вроде как выкинет NullPointerException ?
P> if (a.length == 0) P> throw new IndexOutOfBoundsException("length is 0");
почему именно IndexOutOfBoundsException ?
P> if (a.length == 1) P> return a[0];
Лишний код , лишняя проверка ?
P> if (a[i] > max) P> max = a[i];
рекомендовал бы max = max(max, a[i])
Спасибо за потреченное время , было интересно.
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[10]: Почему преждевременная оптимизация - корень всех зол
Здравствуйте, Сергей, Вы писали:
С>Какие ошибки-то?
Думаю что вы не согласитесь что это ошибки но я считаю это ошибками.
1. Нет обработки случая нулевого массива. ассерт это не наш метод потому что находится в теле функции , в документации к функции нет прекондишенов. Фактически если у меня только заголовок перед глазами , я не вижу причин вызвать функцию с ненулевой длиной.
2. при массиве нулевой длины может быть большой бабах при обращении к несуществующему элементу .
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[9]: Почему преждевременная оптимизация - корень всех зол?
Здравствуйте, minorlogic, Вы писали:
M>1. Нет обработки случая нулевого массива. ассерт это не наш метод потому что находится в теле функции , в документации к функции нет прекондишенов. Фактически если у меня только заголовок перед глазами , я не вижу причин вызвать функцию с ненулевой длиной.
Кстати как по вашему должна реагировать эта функция на нулевой массив? Exception?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re[12]: Почему преждевременная оптимизация - корень всех зол
Здравствуйте, CreatorCray, Вы писали:
CC>Здравствуйте, minorlogic, Вы писали:
M>>1. Нет обработки случая нулевого массива. ассерт это не наш метод потому что находится в теле функции , в документации к функции нет прекондишенов. Фактически если у меня только заголовок перед глазами , я не вижу причин вызвать функцию с ненулевой длиной. CC>Кстати как по вашему должна реагировать эта функция на нулевой массив? Exception?
Так, как это делает моя — возвращая итератор end. На мой взгляд это архитектурная ошибка — работать напрямую со значениями.
Re[12]: Почему преждевременная оптимизация - корень всех зол
Здравствуйте, CreatorCray, Вы писали:
CC>Кстати как по вашему должна реагировать эта функция на нулевой массив? Exception?
Нет , я бы ексепшен не использовал , флажок какойнить например ... Но в любом случае функция может в интерфейсе сообщить пользователю о возможности возникновения вот такой вот ситуации.
Но ексепшен тоже неплохо, намного лучше чем просто упасть.
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[12]: Почему преждевременная оптимизация - корень всех зол
Здравствуйте, skeptik_, Вы писали:
M>>>1. Нет обработки случая нулевого массива. ассерт это не наш метод потому что находится в теле функции , в документации к функции нет прекондишенов. Фактически если у меня только заголовок перед глазами , я не вижу причин вызвать функцию с ненулевой длиной. CC>>Кстати как по вашему должна реагировать эта функция на нулевой массив? Exception? _>Так, как это делает моя — возвращая итератор end. На мой взгляд это архитектурная ошибка — работать напрямую со значениями.
Кстати из исходного условия "написать функцию нахождения максимального элемента в массиве целых чисел" не совсем ясно что требуется: само значение, или какая то ссылка (указатель/итератор) на элемент с максимальным значением.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re[9]: Почему преждевременная оптимизация - корень всех зол?
Здравствуйте, minorlogic, Вы писали:
M>Явку знаю плохо , поэтому прокоментируй плиз.
P>> if (a == null) P>> throw new NullPointerException("Array is empty");
M>А разве такое поведенеи не будет если проверки не делать ? при первом же обращении вроде как выкинет NullPointerException ?
Будет, разумеется. Но ты бы тогда спросил, где обработка входных параметров? Вот я и выписал.
P>> if (a.length == 0) P>> throw new IndexOutOfBoundsException("length is 0");
M>почему именно IndexOutOfBoundsException ?
Это можно было тоже не писать. Если сделать так в вызывающем коде:
{
a = new int[0];
max = find(a)
}
Java выбрасывает именно это исключение. Но мне кажется, читать, как я написал, все же понятнее. Ну и, опять же, явный контроль ввода.
P>> if (a.length == 1) P>> return a[0];
M>Лишний код , лишняя проверка ?
Это, разумеется, можно было не писать.
P>> if (a[i] > max) P>> max = a[i];
M>рекомендовал бы max = max(max, a[i])
Зачем? Разве max не реализует тот же самый if?
M>Спасибо за потреченное время , было интересно.
P.S. Я не противник использования в приложениях стандартных средств. Когда работа идет в нормальном режиме, тогда времени хватает на все: найти в документации описания, набросать пару методов, чтобы посмотреть, как работает, и т. п. Но в клинических, повторю, случаях, приходится превращаться в "чукчу-писателя". Думаю, не только я с подобным сталкиваюсь. Сейчас, првада, все реже.
P.P.S Велосипед для двоичного поиска я бы писать, пожалуй, не стал.
Re[14]: Почему преждевременная оптимизация - корень всех зол
Здравствуйте, CreatorCray, Вы писали:
CC>>>Кстати как по вашему должна реагировать эта функция на нулевой массив? Exception? _>>Так, как это делает моя — возвращая итератор end. На мой взгляд это архитектурная ошибка — работать напрямую со значениями. CC>Кстати из исходного условия "написать функцию нахождения максимального элемента в массиве целых чисел" не совсем ясно что требуется: само значение, или какая то ссылка (указатель/итератор) на элемент с максимальным значением.
Из исходного условия так же не понятно, требовалась ли максимально безопасная (с проверками параметров) или максимально быстрая версия. Применительно к C++, имхо, логичнее было бы предполагать максимально быструю версию (максимум, что в ней может быть еще -- это набор ассертов).
А подход с итераторами ничем не лучше простого возврата значения из наивной реализации max_element, ведь никто не запрещает программисту написать так:
а потом получить крах приложения из-за разыменования итератора end().
Вроде как автор max_element -- он же тут чистенький, весь такой в белом, у него код корректный. А то, что он создает своим корректным кодом лишние заботы пользователю -- так это проблема пользователя
SObjectizer: <микро>Агентно-ориентированное программирование на C++.