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

std::minmax

#include <algorithm>

// 1. So sánh hai giá trị:
// Phiên bản 1
template <class T>
pair<const T&,const T&> minmax (const T& a, const T& b);

// Phiên bản 2 (sử dụng hàm so sánh tùy chỉnh)
template <class T, class Compare>
pair<const T&,const T&> minmax (const T& a, const T& b, Compare comp);

// 2. So sánh các giá trị trong một initializer list:
// Phiên bản 3
template <class T>
pair<T,T> minmax (initializer_list<T> il);

// Phiên bản 4 (sử dụng hàm so sánh tùy chỉnh)
template <class T, class Compare>
pair<T,T> minmax (initializer_list<T> il, Compare comp);

// 3. So sánh các giá trị trong một phạm vi:
// Phiên bản 5
template< class ForwardIt >
std::pair<ForwardIt,ForwardIt> minmax( ForwardIt first, ForwardIt last );

// Phiên bản 6 (sử dụng hàm so sánh tùy chỉnh)
template< class ForwardIt, class Compare >
std::pair<ForwardIt,ForwardIt> minmax( ForwardIt first, ForwardIt last, Compare comp );

Trả về một cặp (pair) chứa giá trị nhỏ nhất và giá trị lớn nhất trong hai giá trị được cung cấp, hoặc trong một danh sách các giá trị (initializer list), hoặc trong một phạm vi được cung cấp. Nói cách khác, nó tìm đồng thời cả min và max.

Tham số

a, b

  • Hai giá trị cần so sánh (phiên bản 1, 2).

il

  • Một initializer_list chứa các giá trị cần so sánh (phiên bản 3, 4).

first

  • Forward Iterator trỏ đến phần tử đầu tiên trong phạm vi (phiên bản 5, 6).

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) (phiên bản 5, 6).

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 2, 4, 6).

Giá trị trả về

  • Phiên bản 1, 2: Một std::pair chứa hai tham chiếu const đến giá trị nhỏ nhất và lớn nhất, tương ứng (pair.first là min, pair.second là max).
  • Phiên bản 3, 4: Một std::pair chứa hai giá trị nhỏ nhất và lớn nhất trong initializer_list il (pair.first là min, pair.second là max).
  • Phiên bản 5, 6: Một std::pair chứa hai iterator, iterator thứ nhất trỏ đến phần tử nhỏ nhất, iterator thứ hai trỏ đến phần tử lớn nhất trong phạm vi (pair.first là min, pair.second là max). Nếu có nhiều phần tử nhỏ nhất hoặc lớn nhất, các iterator sẽ trỏ đến phần tử đầu tiên được tìm thấy. Nếu phạm vi rỗng, pair chứa hai iterator bằng last.

Đặc điểm

  1. Các phiên bản minmax() với hai đối số trả về một pair chứa các tham chiếu const đến giá trị nhỏ nhất và lớn nhất, vì vậy bạn không thể thay đổi các giá trị trả về.
  2. Các phiên bản minmax() với initializer_list trả về một pair chứa hai giá trị, không phải tham chiếu.
  3. Từ C++11, các phiên bản minmax() 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).
  4. 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 min và max theo thứ tự giảm dần, tìm đối tượng có thuộc tính nhỏ nhất/lớn nhất,...).
  5. 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.
  6. minmax() thường được sử dụng để:
    • Tìm đồng thời giá trị nhỏ nhất và lớn nhất giữa hai biến số.
    • Tìm đồng thời giá trị nhỏ nhất và lớn nhất trong một tập hợp các giá trị (initializer list hoặc container).
    • Tìm đồng thời phần tử nhỏ nhất và lớn nhất trong một container.
    • 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()max() riêng biệt.
Phân biệt với min() và max()
  • min() tìm giá trị nhỏ nhất.
  • 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.

Ví dụ

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

// Hàm so sánh tùy chỉnh để tìm minmax theo trị tuyệt đối
bool compareAbs(int a, int b) {
return std::abs(a) < std::abs(b);
}

int main() {
int x = 10;
int y = 5;

// Tìm min và max giữa x và y
auto minmaxVal = std::minmax(x, y);
std::cout << "Min of " << x << " and " << y << " is: " << minmaxVal.first << std::endl;
std::cout << "Max of " << x << " and " << y << " is: " << minmaxVal.second << std::endl;

// Tìm min và max trong initializer list
auto minmaxVal2 = std::minmax({3, 1, 4, 1, 5, 9, 2, 6});
std::cout << "Min in initializer list: " << minmaxVal2.first << std::endl;
std::cout << "Max in initializer list: " << minmaxVal2.second << std::endl;

// Tìm min và max theo trị tuyệt đối trong initializer list (sử dụng hàm so sánh tùy chỉnh)
auto minmaxAbs = std::minmax({-3, 1, -4, 1, -5, 9, -2, 6}, compareAbs);
std::cout << "Min abs in initializer list: " << minmaxAbs.first << std::endl;
std::cout << "Max abs in initializer list: " << minmaxAbs.second << std::endl;

std::vector<int> numbers = {7, 2, 9, 1, 5};

// Tìm min và max trong mảng
auto minmaxIt = std::minmax(numbers.begin(), numbers.end());
std::cout << "Min in vector: " << *minmaxIt.first << std::endl;
std::cout << "Max in vector: " << *minmaxIt.second << std::endl;

// Tìm min và max trong mảng theo tiêu chí tùy chỉnh (giảm dần)
auto minmaxItDesc = std::minmax(numbers.begin(), numbers.end(), [](int a, int b) { return a > b; });
std::cout << "Min in vector (descending): " << *minmaxItDesc.first << std::endl;
std::cout << "Max in vector (descending): " << *minmaxItDesc.second << std::endl;

return 0;
}

Các hàm liên quan

minmax_elementTì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 được chỉ định
minTrả về giá trị nhỏ nhất trong hai giá trị được cung cấp
maxTrả về giá trị lớn nhất trong hai giá trị được cung cấp