Нет реальной необходимости инициализировать наименьшее/наибольшее возможное, чтобы найти наименьшее/наибольшее значение в массиве:
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 тогда и только тогда, когда вектор не содержит ненулевых значений.
person
Jerry Coffin
schedule
21.04.2010