Dizideki en küçük / en büyüğü bulmak için mümkün olan en küçüğü / en büyüğü başlatmaya gerçekten gerek yoktur:
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];
}
Veya birden fazla yapıyorsanız:
#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;
}
Örnek kod sağlamanın dezavantajı - Başkalarının da aynı fikri önerdiğini görüyorum.
Standart bir min_element ve max_element'e sahipken, bunları kullanmanın veriyi iki kez taramayı gerektireceğini unutmayın; bu, dizi büyükse bir sorun olabilir. Son standartlar std::minmax_element
, find_extrema
yukarıdakilerle aynı şeyi yapan (bir koleksiyondaki hem minimum hem de maksimum öğeleri tek geçişte bulun) ekleyerek bunu ele almıştır .
Düzenleme: Bir işaretsiz dizide sıfır olmayan en küçük değeri bulma sorununu ele almak: işaretsiz değerlerin bir uç noktaya ulaştığında "sardığını" gözlemleyin. Sıfır olmayan en küçük değeri bulmak için, karşılaştırma için her birinden bir tane çıkarabiliriz. Sıfır değerleri, tür için olası en büyük değere "sarılır", ancak diğer değerler arasındaki ilişki korunur. İşimiz bittikten sonra, bulduğumuz değere açıkça bir tane ekliyoruz.
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;
}
Bunun hala başlangıç değeri için ilk öğeyi kullandığına dikkat edin, ancak yine de herhangi bir "özel durum" koduna ihtiyacımız yok - bu, mümkün olan en büyük değere sarılacağından, sıfır olmayan herhangi bir değer daha küçük olarak karşılaştırılacaktır. Sonuç, sıfır olmayan en küçük değer veya ancak ve ancak vektör sıfırdan farklı değerler içermiyorsa 0 olur.