บทความนี้จะนำเสนอเทคนิคและฟีเจอร์พิเศษของ C++ ที่ช่วยเพิ่มประสิทธิภาพการเขียนโค้ด โดยเฉพาะสำหรับการแข่งขันเขียนโปรแกรม (Competitive Programming) ซึ่งช่วยลดเวลาในการเขียนโค้ดได้อย่างมาก มาดูตัวอย่างแต่ละข้อกัน
1. ตรวจสอบเลขคู่/คี่ โดยไม่ใช้ %
ใช้บิตวайส์ AND กับ 1 หากผลลัพธ์ไม่เป็นศูนย์ = เลขคี่ มิฉะนั้น = เลขคูญ เนื่องจากเลขคี่ทุกตัวมี LSB เป็น 1
if ((n & 1) != 0) { // เลขคี่ } else { // เลขคู่ }
2. คูณ/หารเร็วด้วย Shift Operator
คูณ 2n = shift left n ครั้ง, หาร 2n = shift right n ครั้ง
x = 40; y = x << 2; // x * 4 = 160 x = 40; y = x >> 2; // x / 4 = 10
3. สลับค่าสองตัวแปรโดยไม่ใช้ตัวแปรที่สาม
ใช้ XOR bitwise operator
x ^= y; y ^= x; x ^= y;
4. วนลูปสตริงโดยไม่ใช้ strlen()
for(int i = 0; s[i]; i++) { cout << s[i]; }
5. ใช้ emplace_back() แทน push_back()
เร็วกว่า เพราะสร้างอ็อบเจกต์ใน container โดยตรง ไม่ต้องจัดสรรหน่วยความจำเพิ่ม
6. ฟังก์ชัน GCD ในตัว (__gcd)
__gcd(x, y) // หาค่าตัวหารร่วมมาก
7. ขนาดอาร์เรย์สูงสุด
ใน main() ประมาณ 106 แต่งлобอลได้ถึง 107
8. หาหลักสำคัญที่สุดด้วย log
n = 4578; double k = log10(n); k = k - floor(k); int x = pow(10, k);
9. นับจำนวนหลักด้วย log
int digit_count = floor(log10(n)) + 1;
10. ตรวจสอบกำลังของ 2
bool check = x && (!(x & (x-1)));
11. อัลกอริทึม all_of, any_of, none_of
all_of(begin, end, isPositive()); // ทุกตัวเป็นบวก any_of(begin, end, isPositive()); // อย่างน้อยหนึ่งตัวเป็นบวก none_of(begin, end, isPositive()); // ไม่มีตัวไหนเป็นบวก
12. copy_n คัดลอกอาร์เรย์
copy_n(src, 5, dest);
13. iota สร้างลำดับตัวเลข/ตัวอักษร
iota(arr, arr+5, 15); // {15,16,17,18,19}
iota(str, str+5, 'A'); // {'A','B','C','D','E'}
14. เขียนเลขฐานสองด้วย 0b
int x = 0b1101; // x = 13
15. ใช้คีย์เวิร์ด and, or แทน &&, ||
if (x < 10 and x > 5) cout << "True";