यहां हम C++ प्रोग्रामिंग भाषा के कुछ अच्छे ट्रिक्स देखेंगे जो विभिन्न क्षेत्रों में हमारी मदद कर सकते हैं। जैसे यदि हम किसी प्रतिस्पर्धी प्रोग्रामिंग इवेंट में भाग लेना चाहते हैं, तो ये ट्रिक्स कोड लिखने का समय कम करने में मदद करेंगे। आइए इनमें से कुछ उदाहरणों को एक-एक करके देखें।
बिना % ऑपरेटर के संख्या विषम या सम है जांचें। यह ट्रिक सरल है। हम संख्या और 1 के साथ बिटवाइज AND ऑपरेशन कर सकते हैं। यदि परिणाम शून्येतर है तो यह विषम है, अन्यथा सम। तर्क बहुत सरल है। सभी विषम संख्याओं में LSb पर 1 होता है। इसलिए 1 के साथ AND करने पर, यह LSb को छोड़कर सभी वर्णों को मास्क कर देगा ताकि हम आसानी से वांछित परिणाम प्राप्त कर सकें।
if ((n & 1) != 0) {
//this is odd
} else {
//This is even
}
शिफ्ट ऑपरेटर का उपयोग करके तेज़ गुणा और भाग। यदि हम किसी संख्या को 2^n जैसी संख्या से गुणा करना चाहते हैं तो हम संख्या को बाएं n बार शिफ्ट कर सकते हैं। इसी तरह, यदि हम किसी संख्या को 2^n से विभाजित करना चाहते हैं तो संख्या को दाएं n बार शिफ्ट करें।
x = 40; y = x << 2; //x को 4 से गुणा किया जाएगा, तो y = 160 cout << x; x = 40; y = x >> 2; //x को 4 से विभाजित किया जाएगा, तो y = 10 cout << x;
तीसरे वेरिएबल के बिना दो संख्याओं को स्वैप करें। यह + और - ऑपरेटर्स का उपयोग करके किया जा सकता है। लेकिन हम इसे बिटवाइज XOR ऑपरेटर्स का उपयोग करके भी कर सकते हैं। आप मैन्युअली संख्याओं की जांच कर सकते हैं।
//swap x and y x ^= y; y ^= x; x ^= y;
कभी-कभी प्रतिबंध होते हैं कि हम अपने कोड में strlen() फ़ंक्शन का उपयोग नहीं कर सकते। उस स्थिति में हम अपना strlen() फ़ंक्शन बनाते हैं। यदि मामला केवल वर्णों तक पहुंचने का है, तो हमें वास्तव में ऐसा करने की आवश्यकता नहीं है। हम जांच सकते हैं कि स्थिति i पर वर्ण वैध (गैर-शून्य) है या नहीं। यदि यह गैर-शून्य है तो हम पार कर सकते हैं, अन्यथा रुकें।
for(int i = 0; s[i]; i++){
cout << s[i];
}
अक्सर हम STL में नए तत्व को वेक्टर जैसे कंटेनर में जोड़ने के लिए push_back() फ़ंक्शन का उपयोग करते हैं। इसके बिना, हम emplace_back() का भी उपयोग कर सकते हैं। यह फ़ंक्शन बहुत तेज़ है। यह कहीं और मेमोरी आवंटित नहीं करता, यह कंटेनर में आवंटित मेमोरी को जोड़ता है।
C++ अंतर्निहित GCD फ़ंक्शन प्रदान करता है। हम उन्हें विभिन्न मामलों में उपयोग कर सकते हैं। सिंटैक्स नीचे जैसा है।
__gcd(x, y) //x और y का GCD खोजें
मुख्य फ़ंक्शन में सरणी का अधिकतम आकार 10^6 के क्रम का है। लेकिन यदि सरणी वैश्विक रूप से घोषित की जाती है, तो हम आकार 10^7 तक घोषित कर सकते हैं।
हम लॉग ऑपरेशन का उपयोग करके किसी भी संख्या का सबसे महत्वपूर्ण अंक निकाल सकते हैं। आइडिया प्राप्त करने के लिए निम्न तर्क देखें।
n = 4578; double k = log10(n); k = k – floor(k); int x = pow(10, k); //x सबसे महत्वपूर्ण अंक है
लॉग ऑपरेशन का उपयोग करके सीधे अंकों की संख्या निकालें। इसके लिए हम किसी लूप का उपयोग नहीं करते।
n = 4578; int digit_count = floor(log10(n)) + 1
हम सीधे इस तर्क का उपयोग करके जांच सकते हैं कि संख्या 2 की घात है या नहीं।
x = 1024; bool check = x && (!(x & (x-1))); //यदि यह सत्य है, तो 2 की घात है।
C++ में कुछ अंतर्निहित एल्गोरिदम हैं जो निम्नलिखित शर्तों की जांच कर सकते हैं।
all_of(left, left + n, isPositive()); //जांचें कि सभी धनात्मक हैं या नहीं any_of(left, left + n, isPositive()); //जांचें कि कम से कम एक धनात्मक है या नहीं। none_of(left, left + n, isPositive()); //जांचें कि कोई तत्व धनात्मक नहीं है
एक कंटेनर से दूसरे में तत्वों को कॉपी करने के लिए कॉपी फ़ंक्शन।
int src[5] = {10, 20, 30, 40, 50};
int des[5];
copy_n(src, 5, dest);
iota() नामक एक एल्गोरिदम है। इस एल्गोरिदम का उपयोग क्रमिक रूप से बढ़ते मानों की एक श्रृंखला बनाने के लिए किया जा सकता है जैसे कि प्रारंभिक मान को *first पर असाइन करके, फिर पोस्ट इन्क्रीमेंट ऑपरेटर का उपयोग करके मान का उपयोग करके।
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'} उत्पन्न करेगा
बाइनरी रूप में मान असाइन करें। हम कुछ बाइनरी नंबर के साथ 0b प्रीफिक्स का उपयोग करके बता सकते हैं कि संख्या बाइनरी में प्रदान की गई है।
int x = 0b1101; //तब x में 13 होगा
C++ में, हम सशर्त ऑपरेटर्स के बिना कीवर्ड्स का उपयोग कर सकते हैं। जैसे कीवर्ड 'and' का उपयोग '&&' के स्थान पर किया जा सकता है।
x = 10;
if(x < 10 and x > 5)
cout << "True" << endl;
else
cout << "False" << endl;
//यह True लौटाएगा