std::max
#include <algorithm>
// 1. So sánh hai giá trị:
// Phiên bản 1 (trước C++11)
template <class T> const T& max (const T& a, const T& b);
// Phiên bản 2 (từ C++11)
template <class T>
constexpr const T& max (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& max (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 max (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 max (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 max( 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 max( ForwardIt first, ForwardIt last, Compare comp );
Trả về giá trị lớn nhất trong hai giá trị được cung cấp, hoặc giá trị lớn nhất trong một danh sách các giá trị (initializer list, từ C++11), hoặc giá trị lớn 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).
Giá trị trả về
- Phiên bản 1, 2, 3: Tham chiếu đến giá trị lớn nhất trong hai giá trị
a
vàb
. - Phiên bản 4, 5: Giá trị lớn nhất trong initializer_list
il
. - Phiên bản 6, 7: Iterator trỏ đến phần tử lớn nhất trong phạm vi. Nếu có nhiều phần tử lớn 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
max()
với hai đối số trả về tham chiếuconst
đến giá trị lớn 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
max()
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ị lớn nhất trong một tập hợp các giá trị.
- Từ C++14, bạn có thể sử dụng
max()
với iterator để tìm phần tử lớn 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ị lớn nhất theo thứ tự giảm dần, tìm đối tượng có thuộc tính lớn 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. max()
thường được sử dụng để:- Tìm giá trị lớn nhất giữa hai biến số.
- Tìm giá trị lớn nhất trong một tập hợp các giá trị (initializer list hoặc container).
- Tìm phần tử lớn 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ị lớn nhất thỏa mãn một điều kiện cụ thể.
Phân biệt với min() và min
max()
min()
tìm giá trị nhỏ nhất.minmax()
tìm đồng thời cả giá trị nhỏ nhất và lớn nhất.max()
tìm giá trị lớn nhất.
Ví dụ
#include <iostream>
#include <algorithm>
#include <vector>
// Hàm so sánh tùy chỉnh để tìm số lẻ lớn nhất
bool compareOdd(int a, int b) {
if (a % 2 == 0 && b % 2 != 0) return false; // a chẵn, b lẻ -> a nhỏ hơn
if (a % 2 != 0 && b % 2 == 0) return true; // a lẻ, b chẵn -> a lớn 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ố lớn hơn giữa x và y
int maxVal = std::max(x, y);
std::cout << "Max of " << x << " and " << y << " is: " << maxVal << std::endl;
// Tìm số lớn nhất trong initializer list
int maxVal2 = std::max({3, 1, 4, 1, 5, 9, 2, 6});
std::cout << "Max in initializer list: " << maxVal2 << std::endl;
// Tìm số lẻ lớn nhất trong initializer list (sử dụng hàm so sánh tùy chỉnh)
int maxOdd = std::max({3, 1, 4, 1, 5, 9, 2, 6}, compareOdd);
std::cout << "Max odd in initializer list: " << maxOdd << std::endl;
std::vector<int> numbers = {7, 2, 9, 1, 5};
// Tìm số lớn nhất trong mảng
auto maxIt = std::max(numbers.begin(), numbers.end());
std::cout << "Max in vector: " << *maxIt << std::endl;
// Tìm số lớn nhất trong mảng theo tiêu chí tùy chỉnh (giảm dần)
auto maxItDesc = std::max(numbers.begin(), numbers.end(), [](int a, int b) { return a > b; });
std::cout << "Max in vector (descending): " << *maxItDesc << std::endl;
return 0;
}
Các hàm liên quan
min | Trả về giá trị nhỏ nhất trong hai giá trị được cung cấp |
max_element | Tìm phần tử có giá trị lớn nhất trong một phạm vi được chỉ định |