Нет реальной необходимости инициализировать наименьшее / наибольшее возможное, чтобы найти наименьшее / наибольшее в массиве:
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, их использование потребует двойного сканирования данных, что может быть проблемой, если массив вообще большой. Последние стандарты решили эту проблему, добавив a 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, если и только если вектор не содержал ненулевых значений.