Bỏ qua để đến nội dung

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.

#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
});
#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;
}
#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;
}
#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;
}
#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;
}
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
  • <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