Thực sự không cần thiết phải khởi tạo thành nhỏ nhất / lớn nhất có thể để tìm giá trị nhỏ nhất / lớn nhất trong mảng:
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];
}
Hoặc, nếu bạn đang làm điều đó nhiều lần:
#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;
}
Điểm bất lợi của việc cung cấp mã mẫu - Tôi thấy những người khác đã đề xuất ý tưởng tương tự.
Lưu ý rằng mặc dù tiêu chuẩn có min_element và max_element, việc sử dụng chúng sẽ yêu cầu quét qua dữ liệu hai lần, điều này có thể là một vấn đề nếu mảng lớn. Các tiêu chuẩn gần đây đã giải quyết vấn đề này bằng cách thêm a std::minmax_element
, tương tự như find_extrema
ở trên (tìm cả phần tử tối thiểu và tối đa trong một tập hợp trong một lần chuyển).
Chỉnh sửa: Giải quyết vấn đề tìm giá trị khác 0 nhỏ nhất trong một mảng không dấu: quan sát rằng các giá trị không dấu "quấn quanh" khi chúng đạt đến cực trị. Để tìm giá trị khác 0 nhỏ nhất, chúng ta có thể trừ một giá trị cho mỗi giá trị để so sánh. Mọi giá trị 0 sẽ "quấn quanh" giá trị lớn nhất có thể cho kiểu, nhưng mối quan hệ giữa các giá trị khác sẽ được giữ lại. Sau khi hoàn thành, chúng tôi rõ ràng là thêm một trở lại giá trị mà chúng tôi đã tìm thấy.
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;
}
Lưu ý rằng điều này vẫn sử dụng phần tử đầu tiên cho giá trị ban đầu, nhưng chúng tôi vẫn không cần bất kỳ mã "trường hợp đặc biệt" nào - vì điều đó sẽ bao quanh giá trị lớn nhất có thể, mọi giá trị khác 0 sẽ được so sánh là nhỏ hơn. Kết quả sẽ là giá trị khác không nhỏ nhất hoặc 0 nếu và chỉ khi vectơ không chứa giá trị khác 0.