Dưới đây là một số thủ thuật và tính năng ít bekannt của C++ giúp tối ưu hóa mã nguồn, đặc biệt hữu ích trong lập trình thi đấu (competitive programming) để giảm thời gian viết code. Chúng ta sẽ đi qua từng ví dụ một.
1. Kiểm tra số chẵn/lẻ không dùng toán tử %
Thực hiện phép AND bitwise giữa số cần kiểm tra và 1. Nếu kết quả khác 0 là số lẻ, ngược lại là số chẵn. Nguyên lý: mọi số lẻ đều có bit cuối (LSB) bằng 1.
if ((n & 1) != 0) {
// số lẻ
} else {
// số chẵn
}
2. Nhân/chia nhanh bằng toán tử dịch bit
Nhân với 2n: dịch trái n lần. Chia cho 2n: dịch phải n lần.
x = 40; y = x << 2; // nhân 4 → y = 160 x = 40; y = x >> 2; // chia 4 → y = 10
3. Hoán đổi hai biến không dùng biến trung gian (XOR swap)
x ^= y; y ^= x; x ^= y;
4. Duyệt chuỗi không cần strlen()
Kiểm tra ký tự tại vị trí i có khác '\0' (non-zero) để quyết định tiếp tục lặp.
for (int i = 0; s[i]; i++) {
cout << s[i];
}
5. emplace_back() thay vì push_back()
emplace_back() nhanh hơn vì xây dựng đối tượng trực tiếp trong bộ nhớ của container, tránh cấp phát/ sao chép thêm.
6. Hàm GCD tích hợp sẵn
__gcd(x, y) // trả về ước chung lớn nhất
7. Kích thước mảng tối đa
Trong hàm main: ~106 phần tử. Khai báo global: lên đến 107.
8. Tìm chữ số hàng đầu (most significant digit) bằng log
n = 4578; double k = log10(n); k = k - floor(k); int x = pow(10, k); // x là chữ số hàng đầu
9. Đếm số chữ số không dùng vòng lặp
n = 4578; int digit_count = floor(log10(n)) + 1;
10. Kiểm tra số nguyên tố 2 (power of 2)
x = 1024; bool check = x && (!(x & (x - 1))); // true nếu là 2^k
11. Thuật toán all_of, any_of, none_of
all_of(begin, end, isPositive); // tất cả dương? any_of(begin, end, isPositive); // ít nhất một dương? none_of(begin, end, isPositive); // không có dương?
12. copy_n() sao chép mảng/container
int src[5] = {10,20,30,40,50};
int dest[5];
copy_n(src, 5, dest);
13. iota() sinh dãy giá trị tăng dần
int arr[5] = {0};
char str[5] = {0};
iota(arr, arr+5, 15); // {15,16,17,18,19}
iota(str, str+5, 'A'); // {'A','B','C','D','E'}
14. Hằng số nhị phân với tiền tố 0b (C++14)
int x = 0b1101; // x = 13
15. Từ khóa thay thế cho toán tử logic (and, or, not)
if (x < 10 and x > 5) cout << "True";