Ở đây sẽ xem một số thủ thuật hay của ngôn ngữ C++ giúp ích trong nhiều lĩnh vực. Nếu muốn tham gia các cuộc thi lập trình cạnh tranh, các thủ thuật này giúp giảm thời gian viết code. Xem từng ví dụ một.
Kiểm tra số lẻ chẵn không dùng toán tử %. Thực hiện phép AND bitwise giữa số và 1. Nếu kết quả khác 0 thì lẻ, ngược lại chẵn. Tất cả số lẻ có bit LSb là 1. Sau khi AND với 1, nó che tất cả các bit trừ LSb nên dễ dàng lấy kết quả.
if ((n & 1) != 0){ //số lẻ } else { //Số chẵn }Nhân chia nhanh dùng toán tử dịch bit. Muốn nhân một số với 2^n thì dịch trái n lần. Muốn chia cho 2^n thì dịch phải n lần.
x = 40; y = x << 2; //x nhân 4, y = 160 cout << x; x = 40; y = x >> 2; //x chia 4, y = 10 cout << x;
Hoán đổi hai số không dùng biến thứ ba. Có thể dùng + và -, nhưng cũng dùng được XOR bitwise.
//hoán đổi x và y x ^= y; y ^= x; x ^= y;
Không dùng strlen(). Tự viết hàm strlen() hoặc kiểm tra ký tự tại vị trí i có hợp lệ (khác 0) hay không. Nếu khác 0 thì duyệt tiếp, ngược lại dừng.
for(int i = 0; s[i]; i++) { cout << s[i]; }Dùng emplace_back() thay push_back(). Hàm emplace_back() nhanh hơn, không cấp phát bộ nhớ ở nơi khác mà nối bộ nhớ đã cấp phát vào container.
Hàm GCD có sẵn. Cú pháp:
__gcd(x, y) //tìm GCD của x và y
Kích thước mảng tối đa. Trong hàm main mảng tối đa cỡ 10^6. Khai báo toàn cục thì lên tới 10^7.
Tìm chữ số quan trọng nhất dùng log:
n = 4578; double k = log10(n); k = k - floor(k); int x = pow(10, k); //x là chữ số quan trọng nhất
Đếm chữ số trực tiếp dùng log:
n = 4578; int digit_count = floor(log10(n)) + 1
Kiểm tra lũy thừa của 2:
x = 1024; bool check = x && (!(x & (x-1))); //nếu true thì là lũy thừa 2
Các thuật toán có sẵn:
all_of(left, left + n, isPositive()); //kiểm tra tất cả dương any_of(left, left + n, isPositive()); //kiểm tra ít nhất một dương none_of(left, left + n, isPositive()); //kiểm tra không có phần tử dương
Hàm copy sao chép phần tử giữa các container:
int src[5] = {10, 20, 30, 40, 50}; int des[5]; copy_n(src, 5, dest);Thuật toán iota() tạo dãy giá trị tăng dần:
int arr[5] = {0}; char str[5] = {0}; iota(arr, arr+5, 15); //tạo {15, 16, 17, 18, 19} iota(str, str+5, 'A'); //tạo {'A', 'B', 'C', 'D', 'E'}Gán giá trị dạng nhị phân. Dùng tiền tố 0b:
int x = 0b1101; //x giữ giá trị 13
Từ khóa thay toán tử điều kiện. Từ khóa 'and' thay cho '&&'.
x = 10; if(x < 10 and x > 5) cout << "True" << endl; else cout << "False" << endl; //Trả về True