std::min
#include <algorithm>
// 1. So sánh hai giá trị:
// Phiên bản 1 (trước C++11)
template <class T> const T& min (const T& a, const T& b);
// Phiên bản 2 (từ C++11)
template <class T>
constexpr const T& min (const T& a, const T& b);
// Phiên bản 3 (từ C++11, sử dụng hàm so sánh tùy chỉnh)
template <class T, class Compare>
constexpr const T& min (const T& a, const T& b, Compare comp);
// 2. So sánh các giá trị trong một initializer list (từ C++11):
// Phiên bản 4
template <class T>
T min (initializer_list<T> il);
// Phiên bản 5 (sử dụng hàm so sánh tùy chỉnh)
template <class T, class Compare>
T min (initializer_list<T> il, Compare comp);
// 3. So sánh các giá trị trong một phạm vi (từ C++14):
// Phiên bản 6
template< class ForwardIt >
constexpr ForwardIt min( ForwardIt first, ForwardIt last );
// Phiên bản 7 (sử dụng hàm so sánh tùy chỉnh)
template< class ForwardIt, class Compare >
constexpr ForwardIt min( ForwardIt first, ForwardIt last, Compare comp );
Trả về giá trị nhỏ nhất trong hai giá trị được cung cấp, hoặc giá trị nhỏ nhất trong một danh sách các giá trị (initializer list, từ C++11), hoặc giá trị nhỏ nhất trong một phạm vi được cung cấp (từ C++14).
Tham số
a, b
- Hai giá trị cần so sánh (phiên bản 1, 2, 3).
il
- Một initializer_list chứa các giá trị cần so sánh (phiên bản 4, 5).
first
- Forward Iterator trỏ đến phần tử đầu tiên trong phạm vi.
last
- Forward Iterator trỏ đến phần tử ngay sau phần tử cuối cùng trong phạm vi. Phạm vi là
[first, last)
.
comp
- Một hàm hoặc đối tượng hàm (comparator) nhận hai đối số và trả về true nếu đối số thứ nhất được coi là nhỏ hơn đối số thứ hai theo tiêu chí so sánh, false nếu ngược lại (phiên bản 3, 5, 7).
pred
- Một hàm vị từ (unary predicate) nhận một đối số là phần tử trong phạm vi và trả về true nếu phần tử thỏa mãn điều kiện để bị thay thế, false nếu không.
Giá trị trả về
- Phiên bản 1, 2, 3: Tham chiếu đến giá trị nhỏ nhất trong hai giá trị
a
vàb
. - Phiên bản 4, 5: Giá trị nhỏ nhất trong initializer_list
il
. - Phiên bản 6, 7: Iterator trỏ đến phần tử nhỏ nhất trong phạm vi. Nếu có nhiều phần tử nhỏ nhất, iterator trỏ đến phần tử đầu tiên được tìm thấy. Trường hợp phạm vi rỗng,
last
được trả về.
Đặc điểm
- Phiên bản
min()
với hai đối số trả về tham chiếuconst
đến giá trị nhỏ hơn, vì vậy bạn không thể thay đổi giá trị trả về. - Từ C++11, các phiên bản
min()
với hai đối số làconstexpr
, có nghĩa là chúng có thể được sử dụng trong các biểu thức hằng (constant expressions). - Trong C++11 trở lên, bạn có thể sử dụng initializer list để tìm giá trị nhỏ nhất trong một tập hợp các giá trị.
- Từ C++14, bạn có thể sử dụng
min()
với iterator để tìm phần tử nhỏ nhất trong một phạm vi. - Bạn có thể cung cấp hàm so sánh tùy chỉnh
comp
để thay đổi tiêu chí so sánh (ví dụ: tìm giá trị nhỏ nhất theo thứ tự giảm dần, tìm đối tượng có thuộc tính nhỏ nhất,...). - Trong C++11 trở lên, bạn có thể sử dụng biểu thức lambda cho hàm so sánh
comp
để code ngắn gọn và dễ đọc hơn. min()
thường được sử dụng để:- Tìm giá trị nhỏ nhất giữa hai biến số.
- Tìm giá trị nhỏ nhất trong một tập hợp các giá trị (initializer list hoặc container).
- Tìm phần tử nhỏ nhất trong một container (sử dụng phiên bản từ C++14).
- Kết hợp với các thuật toán khác để tìm giá trị nhỏ nhất thỏa mãn một điều kiện cụ thể.
Phân biệt với max() và minmax()
max()
tìm giá trị lớn nhất.minmax()
tìm đồng thời cả giá trị nhỏ nhất và lớn nhất.min()
tìm giá trị nhỏ nhất.
Ví dụ
#include <iostream>
#include <algorithm>
#include <vector>
// Hàm so sánh tùy chỉnh để tìm số chẵn nhỏ nhất (nếu không có số chẵn, trả về số lớn nhất)
bool compareEven(int a, int b) {
if (a % 2 != 0 && b % 2 == 0) return false; // a lẻ, b chẵn -> a lớn hơn
if (a % 2 == 0 && b % 2 != 0) return true; // a chẵn, b lẻ -> a nhỏ hơn
return a < b; // Cả hai cùng chẵn hoặc cùng lẻ -> so sánh bình thường
}
int main() {
int x = 10;
int y = 5;
// Tìm số nhỏ hơn giữa x và y
int minVal = std::min(x, y);
std::cout << "Min of " << x << " and " << y << " is: " << minVal << std::endl;
// Tìm số nhỏ nhất trong initializer list
int minVal2 = std::min({3, 1, 4, 1, 5, 9, 2, 6});
std::cout << "Min in initializer list: " << minVal2 << std::endl;
// Tìm số chẵn nhỏ nhất trong initializer list (sử dụng hàm so sánh tùy chỉnh)
int minEven = std::min({3, 1, 4, 1, 5, 9, 2, 6}, compareEven);
std::cout << "Min even in initializer list: " << minEven << std::endl;
std::vector<int> numbers = {7, 2, 9, 1, 5};
// Tìm số nhỏ nhất trong mảng
auto minIt = std::min(numbers.begin(), numbers.end());
std::cout << "Min in vector: " << *minIt << std::endl;
// Tìm số nhỏ nhất trong mảng theo tiêu chí tùy chỉnh (giảm dần)
auto minItDesc = std::min(numbers.begin(), numbers.end(), [](int a, int b) { return a > b; });
std::cout << "Min in vector (descending): " << *minItDesc << std::endl;
return 0;
}
Các hàm liên quan
max | Trả về giá trị lớn nhất trong hai giá trị được cung cấp |
min_element | Tìm phần tử có giá trị nhỏ nhất trong một phạm vi được chỉ định |