Tidak ada kebutuhan nyata untuk menginisialisasi ke terkecil / terbesar untuk menemukan terkecil / terbesar dalam array:
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];
}
Atau, jika Anda melakukannya lebih dari sekali:
#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;
}
Kerugian dari memberikan kode sampel - Saya melihat orang lain telah menyarankan ide yang sama.
Perhatikan bahwa sementara standar memiliki min_element dan max_element, menggunakan ini akan memerlukan pemindaian melalui data dua kali, yang bisa menjadi masalah jika lariknya besar sama sekali. Standar terbaru telah mengatasi hal ini dengan menambahkan a std::minmax_element
, yang melakukan hal yang sama seperti di find_extrema
atas (temukan elemen minimum dan maksimum dalam koleksi dalam sekali jalan).
Sunting: Mengatasi masalah menemukan nilai bukan nol terkecil dalam larik unsigned: amati bahwa nilai unsigned "membungkus" ketika mencapai nilai ekstrem. Untuk mencari nilai bukan nol terkecil, kita dapat mengurangi satu dari masing-masing untuk perbandingan. Setiap nilai nol akan "membungkus" ke nilai terbesar yang mungkin untuk jenis tersebut, tetapi hubungan antara nilai lain akan dipertahankan. Setelah kami selesai, kami jelas menambahkan satu kembali ke nilai yang kami temukan.
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;
}
Perhatikan bahwa ini masih menggunakan elemen pertama untuk nilai awal, tetapi kami masih tidak memerlukan kode "kasus khusus" - karena kode tersebut akan menghasilkan nilai terbesar yang mungkin, nilai bukan nol apa pun akan dibandingkan sebagai lebih kecil. Hasilnya akan menjadi nilai bukan nol terkecil, atau 0 jika dan hanya jika vektor tidak berisi nilai bukan nol.