Немає реальної потреби ініціалізуватися до найменшого / найбільшого можливого, щоб знайти найменший / найбільший у масиві:
double largest = smallest = array[0];
for (int i=1; i<array_size; i++) {
if (array[i] < smallest)
smallest = array[i];
if (array[i] > largest0
largest= array[i];
}
Або якщо ви це робите не один раз:
#include <utility>
template <class iter>
std::pair<typename iter::value_type, typename iter::value_type> find_extrema(iter begin, iter end) {
std::pair<typename iter::value_type, typename iter::value_type> ret;
ret.first = ret.second = *begin;
while (++begin != end) {
if (*begin < ret.first)
ret.first = *begin;
if (*begin > ret.second)
ret.second = *begin;
}
return ret;
}
Недолік надання зразкового коду - я бачу, що інші вже запропонували таку ж ідею.
Зауважте, що хоча стандарт має min_element та max_element, їх використання потребує сканування даних двічі, що може бути проблемою, якщо масив взагалі великий. Останні стандарти вирішили цю проблему, додавши а std::minmax_element
, який робить те саме, що і find_extrema
вище (знайдіть як мінімум, так і максимальний елемент у колекції за один прохід).
Редагувати: вирішення проблеми пошуку найменшого ненульового значення в масиві без підпису: спостерігайте за тим, що неподписані значення "обертаються", коли вони досягають крайності. Щоб знайти найменше ненульове значення, ми можемо відняти одне з кожного для порівняння. Будь-які нульові значення "обернуться" до найбільшого можливого значення для типу, але зв'язок між іншими значеннями збережеться. Після того, як ми закінчимо, ми, очевидно, повернемо назад значення, яке ми знайшли.
unsigned int min_nonzero(std::vector<unsigned int> const &values) {
if (vector.size() == 0)
return 0;
unsigned int temp = values[0]-1;
for (int i=1; i<values.size(); i++)
if (values[i]-1 < temp)
temp = values[i]-1;
return temp+1;
}
Зверніть увагу, що для початкового значення все ще використовується перший елемент, але нам все ще не потрібен код "спеціального випадку" - оскільки це буде завершуватися до найбільшого можливого значення, будь-яке ненульове значення буде порівнюватися як менше. Результатом буде найменше ненульове значення, або 0, якщо і тільки якщо вектор не містив ненульових значень.