Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ฟีเจอร์แฝงของ C++ ที่ควรทราบ

บทความนี้จะนำเสนอเทคนิคและฟีเจอร์พิเศษของ 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";