এখানে আমরা C++ প্রোগ্রামিং ভাষার কিছু ভালো ট্রিক দেখব যা বিভিন্ন ক্ষেত্রে সাহায্য করতে পারে। যেমন যদি আমরা প্রতিযোগিতামূলক প্রোগ্রামিং ইভেন্টে অংশ নিতে চাই, তবে এই ট্রিকগুলো কোড লেখার সময় বাঁচাতে সাহায্য করবে। চলুন একে একে উদাহরণগুলো দেখি।
- মডিউলো (%) অপারেটর ছাড়া একটি সংখ্যা বিজোড় নাকি জোড় তা চেক করা। এই ট্রিকটি সহজ। আমরা সংখ্যাটি এবং ১-এর সাথে বিটওয়াইজ AND অপারেশন করব। ফলাফল যদি নন-জিরো হয় তবে বিজোড়, অন্যথায় জোড়। লজিকটি খুব সহজ। সব বিজোড় সংখ্যার LSB-এ ১ থাকে। তাই ১-এর সাথে 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 will be multiplied with 4, so y = 160 cout << x; x = 40; y = x >> 2; //x will be divided by 4, so y = 10 cout << x;
- তৃতীয় ভেরিয়েবল ছাড়া দুটি সংখ্যা বিনিময় (swap) করা। এটি + এবং - অপারেটর দিয়ে করা যায়। কিন্তু বিটওয়াইজ XOR অপারেটর দিয়েও করা যায়। আপনি ম্যানুয়ালি চেক করে নিশ্চিত হতে পারেন।
//swap x and y x ^= y; y ^= x; x ^= y;
- কখনো কখনো strlen() ফাংশন ব্যবহার করা নিষিদ্ধ থাকে। সেক্ষেত্রে নিজস্ব strlen() লিখতে হয়। কিন্তু কেবল ক্যারেক্টার অ্যাক্সেস করলে এই টেকনিক ব্যবহার করা যায়। পজিশন i-এ ক্যারেক্টারটি বৈধ (non-zero) কিনা চেক করলে হবে। যদি নন-জিরো হয় তবে ট্রাভার্স করব, অন্যথায় থামব।
for(int i = 0; s[i]; i++){ cout << s[i]; }- STL-এ push_back() ফাংশন খুব ব্যবহৃত। এর বদলে emplace_back() ব্যবহার করা যেতে পারে। এটি অনেক দ্রুত। এটি মেমরি অন্য জায়গায় অ্যালোকেট না করে কন্টেইনারের ভিতরেই অ্যালোকেট করে।
- C++-এ বিল্ট-ইন GCD ফাংশন আছে। এটি বিভিন্ন কাজে ব্যবহার করা যায়। সিনট্যাক্স নিচের মতো:
__gcd(x, y) //find GCD of x and y
- main ফাংশনে অ্যারে ম্যাক্সিমাম আকার ১০^৬ অর্ডারের। কিন্তু গ্লোবালি ডিক্লেয়ার করলে ১০^৭ পর্যন্ত আকার নেওয়া যায়।
- লগ অপারেশন দিয়ে যেকোনো সংখ্যার মোস্ট সিগনিফিক্যান্ট ডিজিট (MSD) বের করা।
n = 4578; double k = log10(n); k = k - floor(k); int x = pow(10, k); //x is the most significant digit
- লগ অপারেশন দিয়ে সরাসরি ডিজিট কাউন্ট বের করা। লুপ ব্যবহার ছাড়া।
n = 4578; int digit_count = floor(log10(n)) + 1
- একটি সংখ্যা ২-এর ঘাত কিনা তা সরাসরি চেক করা।
x = 1024; bool check = x && (!(x & (x-1))); //if this is true, then power of two.
- C++-এ কিছু বিল্ট-ইন অ্যালগরিদম আছে যেগুলো নিচের শর্তগুলো চেক করতে পারে।
all_of(left, left + n, isPositive()); //check all are positive or not any_of(left, left + n, isPositive()); //check at least one positive or not. none_of(left, left + n, isPositive()); //check no elements are positive
- এক কন্টেইনারের এলিমেন্ট অন্য কন্টেইনারে কপি করার ফাংশন।
int src[5] = {10, 20, 30, 40, 50}; int des[5]; copy_n(src, 5, dest);- iota() নামের একটি অ্যালগরিদম আছে। এটি সিকোয়েনশিয়ালি বৃদ্ধি পাওয়া মানগুলো একটি রেঞ্জে জেনারেট করতে পারে।
int arr[5] = {0}; char str[5] = {0}; iota(arr, arr+5, 15); //it will generate {15, 16, 17, 18, 19} iota(str, str+5, 'A'); //it will generate {'A', 'B', 'C', 'D', 'E'}- বাইনারি ফরম্যাটে মান অ্যাসাইন করা। 0b প্রিফিক্স দিয়ে বাইনারি সংখ্যা দেওয়া যায়।
int x = 0b1101; //then x will hold 13
- C++-এ কন্ডিশনাল অপারেটর ছাড়া কীওয়ার্ড ব্যবহার করা যায়। যেমন 'and' কীওয়ার্ড '&&'র জায়গায় ব্যবহার করা যায়।
x = 10; if(x < 10 and x > 5) cout << “True” << endl; else cout << “False” << endl; //This will return True