Il n'est pas nécessaire d'initialiser au plus petit/plus grand possible pour trouver le plus petit/plus grand dans le tableau :
double largest = smallest = array[0];
for (int i=1; i largest0
largest= array[i];
}
Ou, si vous le faites plus d'une fois :
#include
template
std::pair find_extrema(iter begin, iter end) {
std::pair 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;
}
L'inconvénient de fournir du code exemple - je vois que d'autres ont déjà suggéré la même idée.
Notez que bien que la norme dispose d'un min_element et d'un max_element, les utiliser nécessiterait de parcourir les données deux fois, ce qui pourrait poser problème si le tableau est assez grand. Les normes récentes ont abordé ce problème en ajoutant un std::minmax_element
, qui fait la même chose que le find_extrema
ci-dessus (trouver à la fois les éléments minimum et maximum dans une collection en un seul passage).
Édition : En abordant le problème de trouver la plus petite valeur non nulle dans un tableau d'entiers non signés : observez que les valeurs non signées "bouclent" quand elles atteignent un extrême. Pour trouver la plus petite valeur non nulle, nous pouvons soustraire un de chaque pour la comparaison. Toutes les valeurs zéro "boucleront" à la plus grande valeur possible pour le type, mais la relation entre les autres valeurs sera conservée. Après avoir terminé, ajoutons évidemment un à la valeur trouvée.
unsigned int min_nonzero(std::vector const &values) {
if (vector.size() == 0)
return 0;
unsigned int temp = values[0]-1;
for (int i=1; i
`
Remarquez que cela utilise toujours le premier élément pour la valeur initiale, mais nous n'avons toujours pas besoin de code "cas spécial" - cela va boucler jusqu'à la plus grande valeur possible, toute valeur non nulle se comparera comme étant plus petite. Le résultat sera la plus petite valeur non nulle, ou 0 si et seulement si le vecteur ne contient aucune valeur non nulle.
`