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.
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
nbiểu thị số phần tử trong vector nsố nguyên biểu thị các phần tử cần sắp xếp- Một ký tự
orderbiể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:
- Tạo một
std::vector<int>và thêm các số đầu vào vào vector - Dùng
std::sorttrong phần đầu<algorithm>cùng với biểu thức lambda để sắp xếp vector - Lambda nhận hai tham số số nguyên và trả về một giá trị boolean
- Dựa vào ký tự chỉ thứ tự, triển khai logic so sánh phù hợp trong lambda
- 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
orderlàA: sắp xếp theo thứ tự tăng dần (từ nhỏ nhất đến lớn nhất) - Nếu
orderlà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;
}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
1Con trỏ và bộ nhớ
Con trỏ là gì?Toán tử lấy địa chỉToán tử giải tham chiếuCon trỏ nullCon trỏ và mảngBộ nhớ động với newGiải phóng bộ nhớ với deleteÔn tập: luyện tập về con trỏ4Ánh xạ (cặp khóa-giá trị)
Giới thiệu std::mapTạo ánh xạTruy cập và chỉnh sửa giá trịKiểm tra khóaXóa các cặpDuyệt qua ánh xạÔn tập: tần suất từ7Hàm nâng cao
Truyền tham chiếuGiới thiệu về biểu thức lambdaLambda với tham sốLambda với giá trị trả vềGiới thiệu về đệ quyGiai thừa đệ quySắp xếp bằng lambda2Vector (mảng động)
Giới thiệu std::vectorTạo vectorThêm phần tửTruy cập phần tửKích thước vectorDuyệt bằng vòng lặp forVòng lặp for dựa trên phạm viXóa phần tửÔn tập: các thao tác với vector5Dự án: Công cụ quản lý hàng tồn kho
Thiết lập dự ánThêm và cập nhật mặt hàng3Dự án: Công cụ danh sách công việc
Tổng quan dự ánThêm công việc6Tập hợp (các phần tử duy nhất)
Giới thiệu std::setTạo tập hợp và thêm phần tửKiểm tra phần tửXóa phần tửDuyệt qua tập hợpÔn tập: các số duy nhấtTự luyện tập: Trình biên dịch C++ online