Menu
CoddyTech

Sắp xếp bằng lambda

Thuộc phần Logic và luồng chương trình trong hành trình C++ của Coddy. Bài học 47 trên 56.

Thư viện tiêu chuẩn C++ cung cấp một hàm (function) mạnh mẽ có tên là std::sort trong header <algorithm>, có thể sắp xếp các cấu trúc chứa như vector.

Theo mặc định, std::sort sắp xếp các phần tử theo thứ tự tăng dần (từ nhỏ nhất đến lớn nhất). Tuy nhiên, bạn có thể tùy chỉnh cách sắp xếp này bằng cách cung cấp một biểu thức lambda xác định cách so sánh các phần tử:

#include <vector>
#include <algorithm>

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

// Sắp xếp theo thứ tự giảm dần bằng hàm lambda (lambda function)
std::sort(numbers.begin(), numbers.end(), [](int a, int b) {
    return a > b;  // Trả về true nếu a đứng trước b
});

Lambda nhận hai tham số đại diện cho các phần tử đang được so sánh và trả về true nếu phần tử đầu tiên nên đứng trước phần tử thứ hai trong kết quả đã sắp xếp. Với thứ tự giảm dần, ta trả về true khi a > b, nhờ đó các số lớn hơn đứng trước.

Điều này cho thấy lambda giúp bạn dễ dàng tùy chỉnh các hàm trong thư viện chuẩn mà không cần viết các hàm so sánh riêng, nhờ đó logic sắp xếp nằm ngay ở nơi bạn cần.

challenge icon

Thử thách

Dễ

Tạo một chương trình minh họa cách sắp xếp tùy chỉnh bằng biểu thức lambda với std::sort. Thử thách này sẽ kiểm tra mức độ hiểu biết của bạn về cách dùng hàm lambda để xác định logic so sánh tùy chỉnh khi sắp xếp các vùng chứa.

Chương trình sẽ nhận các đầu vào sau:

  • Một số nguyên n biểu thị số phần tử trong vector
  • n số nguyên biểu thị các phần tử cần sắp xếp
  • Một ký tự order biểu thị thứ tự sắp xếp (A để sắp xếp tăng dần, D để sắp xếp giảm dần)

Chương trình của bạn cần:

  1. Tạo một std::vector<int> và thêm các số đầu vào vào vector
  2. Dùng std::sort trong phần đầu <algorithm> cùng với biểu thức lambda để sắp xếp vector
  3. Lambda nhận hai tham số số nguyên và trả về một giá trị boolean
  4. Dựa vào ký tự chỉ thứ tự, triển khai logic so sánh phù hợp trong lambda
  5. In mỗi phần tử của vector đã sắp xếp trên một dòng riêng

Cách sắp xếp như sau:

  • Nếu order là A: sắp xếp theo thứ tự tăng dần (từ nhỏ nhất đến lớn nhất)
  • Nếu order là D: sắp xếp theo thứ tự giảm dần (từ lớn nhất đến nhỏ nhất)

Dùng định dạng đầu ra chính xác sau:

[first_sorted_element]
[second_sorted_element]
...
[last_sorted_element]

Hãy nhớ rằng std::sort nhận ba tham số: iterator bắt đầu, iterator kết thúc và hàm so sánh. Dùng vector.begin() và vector.end() làm các iterator. Hàm so sánh lambda cần trả về true nếu tham số thứ nhất nên đứng trước tham số thứ hai trong kết quả đã sắp xếp. Với thứ tự tăng dần, trả về a < b; với thứ tự giảm dần, trả về a > b.

Tự làm thử

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    // Đọc đầu vào
    int n;
    cin >> n;
    
    vector<int> numbers(n);
    for (int i = 0; i < n; i++) {
        cin >> numbers[i];
    }
    
    char order;
    cin >> order;
    
    // TODO: Viết code bên dưới
    // Dùng std::sort với biểu thức lambda để sắp xếp vector
    // theo ký tự order (A là tăng dần, D là giảm dần)
    
    // In ra các phần tử đã sắp xếp
    for (int num : numbers) {
        cout << num << endl;
    }
    
    return 0;
}
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Logic và luồng chương trình

Tự luyện tập: Trình biên dịch C++ online