Es ist nicht wirklich erforderlich, auf möglichst klein / groß zu initialisieren, um das kleinste / größte im Array zu finden:
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];
}
Oder wenn Sie es mehr als einmal tun:
#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;
}
Der Nachteil der Bereitstellung von Beispielcode - ich sehe, dass andere bereits die gleiche Idee vorgeschlagen haben.
Beachten Sie, dass der Standard zwar ein min_element und ein max_element enthält, für deren Verwendung jedoch ein zweimaliges Durchsuchen der Daten erforderlich ist. Dies kann ein Problem sein, wenn das Array überhaupt groß ist. Neuere Standards haben dies durch Hinzufügen eines a behoben std::minmax_element
, das dasselbe wie find_extrema
oben tut (finden Sie sowohl die minimalen als auch die maximalen Elemente in einer Sammlung in einem einzigen Durchgang).
Bearbeiten: Behebung des Problems, den kleinsten Wert ungleich Null in einem Array von vorzeichenlosen Werten zu finden: Beachten Sie, dass vorzeichenlose Werte "umlaufen", wenn sie ein Extrem erreichen. Um den kleinsten Wert ungleich Null zu finden, können wir für den Vergleich jeweils einen subtrahieren. Alle Nullwerte werden auf den größtmöglichen Wert für den Typ "umgebrochen", aber die Beziehung zwischen anderen Werten bleibt erhalten. Nachdem wir fertig sind, fügen wir dem gefundenen Wert offensichtlich einen hinzu.
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;
}
Beachten Sie, dass hierfür immer noch das erste Element für den Anfangswert verwendet wird, wir jedoch keinen "Sonderfall" -Code benötigen. Da dieser Wert auf den größtmöglichen Wert umgebrochen wird, wird jeder Wert ungleich Null als kleiner verglichen. Das Ergebnis ist der kleinste Wert ungleich Null oder genau dann 0, wenn der Vektor keine Werte ungleich Null enthält.