यहां हम C++ प्रोग्रामिंग भाषा की कुछ अच्छी विशेषताओं और ट्रिक्स को देखेंगे जो विभिन्न क्षेत्रों में हमारी मदद कर सकती हैं। जैसे यदि आप प्रतिस्पर्धात्मक प्रोग्रामिंग (competitive programming) आयोजनों में भाग लेना चाहते हैं, तो ये ट्रिक्स कोड लिखने में लगने वाले समय को कम करने में मदद करेंगे। आइए इन उदाहरणों को एक-एक करके देखते हैं।
1. % ऑपरेटर के बिना विषम/सम संख्या जांचना
यह ट्रिक सरल है। हम संख्या और 1 के साथ बिटवाइज़ AND ऑपरेशन कर सकते हैं। यदि परिणाम शून्येतर (non-zero) है तो यह विषम (odd) है, अन्यथा सम (even)। तर्क सरल है: सभी विषम संख्याओं में LSB (लीस्ट सिग्निफिकेंट बिट) पर 1 होता है। इसलिए 1 के साथ AND करने पर, यह LSB को छोड़कर सभी बिट्स को मास्क कर देता है।
if ((n & 1) != 0) {
// यह विषम है
} else {
// यह सम है
}
2. शिफ्ट ऑपरेटर का उपयोग करके तेज गुणा/भाग
यदि हम किसी संख्या को 2ⁿ जैसी संख्या से गुणा करना चाहते हैं, तो हम संख्या को बाएं (left) n बार शिफ्ट कर सकते हैं। इसी तरह, यदि हम किसी संख्या को 2ⁿ से विभाजित करना चाहते हैं, तो इसे दाएं (right) n बार शिफ्ट करें।
x = 40; y = x << 2; // x को 4 से गुणा किया गया, इसलिए y = 160 cout << y; x = 40; y = x >> 2; // x को 4 से विभाजित किया गया, इसलिए y = 10 cout << y;
3. तीसरे वेरिएबल के बिना दो संख्याओं की अदला-बदली (Swap)
यह + और - ऑपरेटर्स का उपयोग करके किया जा सकता है, लेकिन हम बिटवाइज़ XOR ऑपरेटर्स का उपयोग करके भी कर सकते हैं।
// x और y को स्वैप करें x ^= y; y ^= x; x ^= y;
4. strlen() के बिना स्ट्रिंग ट्रैवर्सल
कभी-कभी प्रतिबंध होते हैं कि हम अपने कोड में strlen() फ़ंक्शन का उपयोग नहीं कर सकते। उस स्थिति में हम अपना खुद का strlen() बनाते हैं। लेकिन यदि मामला केवल कैरेक्टर्स तक पहुंचने का है, तो हमें वास्तव में इसकी आवश्यकता नहीं है। हम जांच सकते हैं कि स्थिति i पर कैरेक्टर वैध (गैर-शून्य) है या नहीं। यदि यह गैर-शून्य है तो हम ट्रैवर्स कर सकते हैं, अन्यथा रुक जाएं।
for(int i = 0; s[i]; i++) {
cout << s[i];
}
5. push_back() के बजाय emplace_back() का उपयोग
STL में नए एलिमेंट जोड़ने के लिए हम अक्सर push_back() फ़ंक्शन का उपयोग करते हैं (जैसे vector में)। इसके बिना हम emplace_back() का भी उपयोग कर सकते हैं। यह फ़ंक्शन बहुत तेज है। यह कहीं और मेमोरी आवंटित नहीं करता, बल्कि कंटेनर में आवंटित मेमोरी को सीधे जोड़ता है।
6. इनबिल्ट GCD फ़ंक्शन
C++ इनबिल्ट GCD फ़ंक्शन प्रदान करता है। हम इसे विभिन्न मामलों में उपयोग कर सकते हैं। सिंटैक्स इस प्रकार है:
__gcd(x, y) // x और y का GCD खोजें
7. सरणी (Array) का अधिकतम आकार
main फ़ंक्शन में सरणी का अधिकतम आकार 10⁶ के क्रम का होता है। लेकिन यदि सरणी वैश्विक रूप से घोषित की जाती है, तो हम 10⁷ तक का आकार घोषित कर सकते हैं।
8. लॉग ऑपरेशन का उपयोग करके सबसे महत्वपूर्ण अंक (Most Significant Digit) निकालना
n = 4578; double k = log10(n); k = k - floor(k); int x = pow(10, k); // x सबसे महत्वपूर्ण अंक है
9. लॉग ऑपरेशन का उपयोग करके सीधे अंकों की संख्या गिनना
हम इसके लिए किसी लूप का उपयोग नहीं करते।
n = 4578; int digit_count = floor(log10(n)) + 1;
10. जांचें कि संख्या 2 की घात (Power of 2) है या नहीं
x = 1024; bool check = x && (!(x & (x-1))); // यदि यह सच है, तो 2 की घात है
11. इनबिल्ट एल्गोरिदम: all_of, any_of, none_of
C++ में कुछ इनबिल्ट एल्गोरिदम हैं जो निम्नलिखित शर्तों की जांच कर सकते हैं।
all_of(left, left + n, isPositive()); // सभी पॉजिटिव हैं या नहीं any_of(left, left + n, isPositive()); // कम से कम एक पॉजिटिव है या नहीं none_of(left, left + n, isPositive()); // कोई भी पॉजिटिव नहीं है
12. कॉपी फ़ंक्शन: एक कंटेनर से दूसरे में एलिमेंट्स कॉपी करना
int src[5] = {10, 20, 30, 40, 50};
int dest[5];
copy_n(src, 5, dest);
13. iota() एल्गोरिदम: क्रमिक मान उत्पन्न करना
यह एल्गोरिदम क्रमिक रूप से बढ़ते मानों की एक श्रृंखला बनाने के लिए उपयोग किया जा सकता है।
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. बाइनरी रूप में मान निर्दिष्ट करना
हम किसी बाइनरी नंबर के साथ 0b प्रीफिक्स का उपयोग करके यह बता सकते हैं कि संख्या बाइनरी में दी गई है।
int x = 0b1101; // तब x में 13 होगा
15. सशर्त ऑपरेटर्स के बिना कीवर्ड्स का उपयोग
C++ में, हम सशर्त ऑपरेटर्स के बिना कीवर्ड्स का उपयोग कर सकते हैं। जैसे कीवर्ड 'and' का उपयोग '&&' के स्थान पर किया जा सकता है।
x = 10;
if(x < 10 and x > 5)
cout << "True" << endl;
else
cout << "False" << endl; // यह True लौटाएगा