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

std::minmax_element

#include <algorithm>

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

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

Tìm đồng thời phần tử có giá trị nhỏ nhất và 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ử nhỏ nhất và 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ề

  • Một std::pair chứa hai Forward Iterator:
    • pair.first: Iterator trỏ đến phần tử nhỏ nhất trong phạm vi.
    • pair.second: Iterator trỏ đến phần tử lớn nhất trong phạm vi.
  • Nếu có nhiều phần tử nhỏ nhất hoặc lớn nhất, iterator trong pair sẽ trỏ đến phần tử đầu tiên tương ứng được tìm thấy.
  • Nếu phạm vi rỗng, pair sẽ chứa hai iterator bằng last.

Đặc điểm

  1. Phạm vi [first, last) là "nửa mở", không bao gồm phần tử last.
  2. minmax_element() không thay đổi phạm vi đầu vào.
  3. minmax_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. minmax_element() thường được sử dụng để:
    • Tìm đồng thời phần tử nhỏ nhất và lớn nhất trong một container (ví dụ: std::vector, std::array, mảng C-style).
    • Xác định biên độ (range) của dữ liệu trong một tập hợp.
    • Tối ưu hóa code khi bạn cần cả giá trị nhỏ nhất và lớn nhất thay vì gọi min_element()max_element() riêng biệt.
Phân biệt với min_element(), max_element(), minmax(), min(), và max()
  • min_element() tìm iterator trỏ đến phần tử nhỏ nhất trong một phạm vi.
  • max_element() tìm iterator trỏ đến phần tử lớn nhất trong một phạm vi.
  • minmax() tìm đồng thời giá trị nhỏ nhất và lớn nhất của hai giá trị hoặc trong một initializer list (từ C++11), hoặc của một phạm vi (từ C++14).
  • min() tìm giá trị nhỏ nhất của hai giá trị hoặc trong một initializer list (từ C++11), hoặc phần tử nhỏ nhất trong một phạm vi (từ C++14).
  • max() tìm giá trị lớn nhất của hai giá trị hoặc trong một initializer list (từ C++11), hoặc phần tử lớn nhất trong một phạm vi (từ C++14).
  • minmax_element() tìm đồng thời iterator trỏ đến phần tử nhỏ nhất và 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 minmax theo giá trị tuyệt đối
bool compareAbs(int a, int b) {
return std::abs(a) < std::abs(b);
}

int main() {
std::vector<int> numbers = {3, 1, -4, 1, 5, -9, 2, 6};

// Tìm min và max trong numbers
auto result = std::minmax_element(numbers.begin(), numbers.end());

std::cout << "Smallest element: " << *result.first << " at index: " << (result.first - numbers.begin()) << std::endl;
std::cout << "Largest element: " << *result.second << " at index: " << (result.second - numbers.begin()) << std::endl;

// Tìm min và max theo giá trị tuyệt đối sử dụng hàm so sánh tùy chỉnh
auto result2 = std::minmax_element(numbers.begin(), numbers.end(), compareAbs);

std::cout << "Smallest absolute value: " << *result2.first << " at index: " << (result2.first - numbers.begin()) << std::endl;
std::cout << "Largest absolute value: " << *result2.second << " at index: " << (result2.second - numbers.begin()) << std::endl;

return 0;
}

Các hàm liên quan

minmaxTrả về một cặp chứa giá trị nhỏ nhất và giá trị lớn nhất trong hai giá trị được cung cấp
min_elementTìm phần tử có giá trị nhỏ nhất trong một phạm vi được chỉ định
max_elementTìm phần tử có giá trị lớn nhất trong một phạm vi được chỉ định
lower_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
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ó