Chuyển tới nội dung chính

std::max_element

#include <algorithm>

// So sánh bằng toán tử <
template <class ForwardIterator>
ForwardIterator max_element (ForwardIterator first, ForwardIterator last);

// Sử dụng hàm so sánh tùy chỉnh
template <class ForwardIterator, class Compare>
ForwardIterator max_element (ForwardIterator first, ForwardIterator last,
Compare comp);

Tìm phần tử có giá trị lớn nhất trong một phạm vi (range) được chỉ định.

Tham số

first

  • Forward Iterator trỏ đến phần tử đầu tiên trong phạm vi cần tìm phần tử lớn nhất.

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ố (hai phần tử trong phạm vi) và trả về true nếu phần tử thứ nhất được coi là nhỏ hơn phần tử thứ hai theo tiêu chí so sánh, false nếu ngược lại. (Phiên bản 2)

Giá trị trả về

  • Forward Iterator trỏ đến phần tử lớn nhất trong phạm vi [first, last). 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.
  • Nếu phạm vi rỗng, last được trả về.

Đặc điểm

  1. Phạm vi [first, last) là "nửa mở", không bao gồm phần tử last.
  2. max_element() không thay đổi phạm vi đầu vào.
  3. max_element() yêu cầu Forward Iterator, cho phép di chuyển một chiều về phía trước.
  4. 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 (phiên bản 2) để code ngắn gọn và dễ đọc hơn.
  5. max_element() thường được sử dụng để:
    • Tìm phần tử lớn nhất trong một container (ví dụ: std::vector, std::array, mảng C-style).
    • Tìm phần tử lớn nhất trong một phần của container.
    • Kết hợp với các thuật toán khác để tìm phần tử lớn nhất thỏa mãn một điều kiện cụ thể.
Phân biệt với min_element(), minmax_element(), và max()
  • min_element() tìm phần tử nhỏ nhất trong một phạm vi.
  • minmax_element() tìm đồng thời cả phần tử nhỏ nhất và lớn nhất trong một phạm vi.
  • max() tìm giá trị lớn nhất của hai giá trị hoặc trong một initializer list, hoặc phần tử lớn nhất trong một phạm vi (từ C++14).
  • max_element() tìm iterator trỏ đến phần tử lớn nhất trong một phạm vi.

Ví dụ

#include <iostream>
#include <vector>
#include <algorithm>

// Hàm so sánh để tìm số lẻ lớn nhất
bool compareOdd(int a, int b) {
if (a % 2 == 0 && b % 2 != 0) return true; // a chẵn, b lẻ -> a nhỏ hơn
if (a % 2 != 0 && b % 2 == 0) return false; // 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() {
std::vector<int> numbers = {5, 2, 8, 1, 9, 4};

// Tìm phần tử lớn nhất trong numbers
auto maxIt = std::max_element(numbers.begin(), numbers.end());

std::cout << "Largest element: " << *maxIt << std::endl;
std::cout << "Index of largest element: " << (maxIt - numbers.begin()) << std::endl;

// Tìm phần tử lớn nhất trong phạm vi từ phần tử thứ 2 đến cuối
auto maxIt2 = std::max_element(numbers.begin() + 1, numbers.end());
std::cout << "Largest element from index 1: " << *maxIt2 << std::endl;

// Tìm số lẻ lớn nhất sử dụng hàm so sánh tùy chỉnh
auto maxOddIt = std::max_element(numbers.begin(), numbers.end(), compareOdd);
std::cout << "Largest odd element: " << *maxOddIt << std::endl;

return 0;
}

Các hàm liên quan

min_elementTìm phần tử có giá trị nhỏ nhất trong một phạm vi được chỉ định
upper_boundTìm vị trí đầu tiên trong một phạm vi đã được sắp xếp mà có thể chèn một giá trị cho trước vào mà không làm mất tính sắp xếp của phạm vi, nhưng phải đảm bảo giá trị được chèn vào sau tất cả các phần tử có giá trị bằng với nó
maxTrả về giá trị lớn nhất trong hai giá trị được cung cấp