Es gibt keine wirkliche Notwendigkeit zu kleinsten/größtmöglichen finden den kleinsten/größten im Array zu initialisieren:
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 tun es mehr als einmal:
#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 andere haben bereits die gleiche Idee vorgeschlagen.
Beachten Sie, dass, während der Standard ein min_element und max_element hat, die Verwendung dieser Daten ein zweimaliges Durchsuchen der Daten erfordern würde, was ein Problem darstellen könnte, wenn das Array überhaupt groß ist. Jüngere Standards haben dies durch Hinzufügen einer std::minmax_element
, die das gleiche wie die obigen find_extrema
(finden Sie die minimalen und maximalen Elemente in einer Sammlung in einem einzigen Durchgang).
Bearbeiten: Adressieren des Problems der Suche nach dem kleinsten Wert ungleich Null in einem Array von unsigned: Beachten Sie, dass vorzeichenlose Werte "wrap around", wenn sie ein Extrem erreichen. Um den kleinsten Wert ungleich Null zu finden, können wir für den Vergleich jeweils eins abziehen. Alle Nullwerte werden auf den größtmöglichen Wert für den Typ "umgebrochen", aber die Beziehung zwischen anderen Werten wird beibehalten. Nachdem wir fertig sind, fügen wir natürlich einen zurück zu dem Wert hinzu, den wir gefunden haben.
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;
}
Hinweis: dieser verwendet immer noch das erste Element für den Anfangswert, aber wir müssen noch keinen „Sonderfall“ Code - da, dass rund um den grösstmöglichen Wert wickeln wird, alle Nicht-Null-Wert wird als kleiner vergleichen. Das Ergebnis ist der kleinste Nicht-Null-Wert oder 0, wenn und nur wenn der Vektor keine Nicht-Null-Werte enthält.
Wie verwende ich das genau? Was muss ich einbeziehen? Ich glaube nicht, dass ich so etwas schon einmal benutzt habe. – Faken
Hmm ... dass die Max-Element-Funktion sehr nützlich gewesen wäre ... das passiert, wenn Sie selbst und nicht formal lernen. Am Ende erfinden Sie das Rad 50-mal neu. Das ist genau wie beim letzten Mal, als ich von ceil() erfuhr. Vielen Dank. – Faken
@Yacoby, möchten Sie vielleicht klar, dass numeric_limits :: min() bedeutet nicht am meisten negativen Wert, es bedeutet kleinste positive. – MSN