Thư viện <algorithm>
Thư viện chuẩn <algorithm> cung cấp sẵn hàng chục thuật toán được tối ưu hiệu năng cao để làm việc với container - sắp xếp, tìm kiếm, đếm, biến đổi dữ liệu… Hầu hết các hàm này hoạt động thông qua iterator, nên dùng được cho nhiều loại container khác nhau.
Sắp xếp với std::sort
Phần tiêu đề “Sắp xếp với std::sort”#include <algorithm>#include <vector>#include <iostream>
int main() { std::vector<int> numbers = {5, 2, 8, 1, 9};
std::sort(numbers.begin(), numbers.end()); // Sắp xếp tăng dần (mặc định) for (int n : numbers) std::cout << n << " "; // 1 2 5 8 9
std::cout << std::endl;
std::sort(numbers.begin(), numbers.end(), std::greater<int>()); // Giảm dần for (int n : numbers) std::cout << n << " "; // 9 8 5 2 1
return 0;}Sắp xếp với lambda tùy chỉnh (đã học ở bài “Lambda function”):
std::sort(numbers.begin(), numbers.end(), [](int a, int b) { return a > b; // Giảm dần});Tìm kiếm với std::find
Phần tiêu đề “Tìm kiếm với std::find”#include <algorithm>#include <vector>#include <iostream>
int main() { std::vector<int> numbers = {10, 20, 30, 40};
auto it = std::find(numbers.begin(), numbers.end(), 30); if (it != numbers.end()) { std::cout << "Tim thay!" << std::endl; }
return 0;}Đếm phần tử thỏa điều kiện với std::count_if
Phần tiêu đề “Đếm phần tử thỏa điều kiện với std::count_if”#include <algorithm>#include <vector>#include <iostream>
int main() { std::vector<int> numbers = {1, 2, 3, 4, 5, 6};
int even_count = std::count_if(numbers.begin(), numbers.end(), [](int n) { return n % 2 == 0; }); std::cout << even_count << std::endl; // 3
return 0;}Tìm giá trị lớn nhất/nhỏ nhất
Phần tiêu đề “Tìm giá trị lớn nhất/nhỏ nhất”#include <algorithm>#include <vector>#include <iostream>
int main() { std::vector<int> numbers = {5, 2, 8, 1, 9};
auto max_it = std::max_element(numbers.begin(), numbers.end()); auto min_it = std::min_element(numbers.begin(), numbers.end());
std::cout << "Max: " << *max_it << ", Min: " << *min_it << std::endl; // Max: 9, Min: 1
return 0;}Đảo ngược thứ tự với std::reverse
Phần tiêu đề “Đảo ngược thứ tự với std::reverse”#include <algorithm>#include <vector>#include <iostream>
int main() { std::vector<int> numbers = {1, 2, 3, 4, 5}; std::reverse(numbers.begin(), numbers.end());
for (int n : numbers) std::cout << n << " "; // 5 4 3 2 1
return 0;}Biến đổi phần tử với std::transform
Phần tiêu đề “Biến đổi phần tử với std::transform”#include <algorithm>#include <vector>#include <iostream>
int main() { std::vector<int> numbers = {1, 2, 3}; std::vector<int> squared(numbers.size());
std::transform(numbers.begin(), numbers.end(), squared.begin(), [](int n) { return n * n; });
for (int n : squared) std::cout << n << " "; // 1 4 9
return 0;}Tính tổng với std::accumulate (từ <numeric>)
Phần tiêu đề “Tính tổng với std::accumulate (từ <numeric>)”#include <numeric>#include <vector>#include <iostream>
int main() { std::vector<int> numbers = {1, 2, 3, 4, 5};
int sum = std::accumulate(numbers.begin(), numbers.end(), 0); // 0 là giá trị khởi đầu std::cout << sum << std::endl; // 15
return 0;}Một số hàm hữu ích khác
Phần tiêu đề “Một số hàm hữu ích khác”| Hàm | Chức năng |
|---|---|
std::all_of / std::any_of / std::none_of |
Kiểm tra tất cả/bất kỳ/không phần tử nào thỏa điều kiện |
std::unique |
Loại bỏ các phần tử trùng lặp liền kề |
std::fill |
Gán cùng một giá trị cho toàn bộ phạm vi |
std::swap |
Hoán đổi giá trị của hai biến |
std::binary_search |
Tìm kiếm nhị phân trên dãy đã sắp xếp |
Tổng kết
Phần tiêu đề “Tổng kết”<algorithm>cung cấp sẵn các thuật toán tối ưu cho việc sắp xếp, tìm kiếm, đếm, biến đổi dữ liệu trên container- Hầu hết các hàm nhận vào một cặp iterator
(begin, end)để xác định phạm vi thao tác - Kết hợp với lambda giúp tùy chỉnh linh hoạt hành vi của thuật toán (điều kiện sắp xếp, lọc, biến đổi…)
- Ưu tiên dùng các hàm có sẵn trong
<algorithm>thay vì tự viết lại vòng lặp thủ công - vừa ít lỗi hơn, vừa thường được tối ưu tốt hơn