এখানে আমরা C++ প্রোগ্রামিং ল্যাঙ্গুয়েজের কিছু ভালো ট্রিক দেখব যা আমাদের বিভিন্ন এলাকায় সাহায্য করতে পারে। যেন যদি আমরা কম্পিটিটিভ প্রোগ্রামিং ইভেন্টে অংশ নিতে চাই, তবে এই ট্রিকগুলো কোড লিখতে সময় কমাতে সাহায্য করবে। এক এক করে উদাহরণগুলো দেখি।
মডুলো (%) অপারেটর ছাড়া কোনো সংখ্যা বিজোড় বা জোড় কিনা চেক করা। এই ট্রিকটা সোজা। আমরা সংখ্যা এবং ১-এর সাথে বিটওয়াইজ AND অপারেশন পারফর্ম করতে পারি। যদি রেজাল্ট নন-জিরো হয় তবে এটি বিজোড়, অন্যথায় জোড়। লজিক খুব সোজা। সব বিজোড় সংখ্যার LSb-এ ১ থাকে। তাই ১ দিয়ে AND পারফর্ম করলে LSb ছাড়া সব ক্যারেক্টার মাস্ক হয়ে যাবে এবং আমরা সহজে রেজাল্ট পাব।
if ((n & 1) != 0) {
// this is odd
} else {
// This is even
}
শিফ্ট অপারেটর ব্যবহার করে দ্রুত গুন এবং ভাগ। যদি আমরা একটি সংখ্যাকে 2ⁿ দিয়ে গুন করতে চাই তবে আমরা সহজে সংখ্যাকে বামে n বার শিফ্ট করতে পারি। একইভাবে, যদি আমরা একটি সংখ্যাকে 2ⁿ দিয়ে ভাগ করতে চাই তবে সংখ্যাকে ডানে 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;
তৃতীয় ভেরিয়েবল ছাড়া দুটি সংখ্যা সোয়াপ করা। এটি + এবং - অপারেটর দিয়ে করা যায়। কিন্তু আমরা বিটওয়াইজ 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 বের করুন
main ফাংশনে অ্যারের সর্বোচ্চ সাইজ 10⁶-এর কোটি। কিন্তু যদি অ্যারে গ্লোবালি ডিক্লেয়ার করা থাকে, তবে সাইজ 10⁷ পর্যন্ত ডিক্লেয়ার করা যায়।
লগ অপারেশন ব্যবহার করে যেকোনো সংখ্যার মোস্ট সিগনিফিক্যান্ট ডিজিট ক্যালকুলেট করা যায়। আইডিয়া পাওয়ার জন্য নিচের লজিক দেখুন।
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()); // সব পজিটিভ কিনা চেক 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);
itoa() নামে একটি অ্যালগরিদম আছে। এই অ্যালগরিদমটি ক্রমাগত বর্ধমান ভ্যালুর একটি রেঞ্জ তৈরি করতে ব্যবহার করা যায় যেন初始 ভ্যালু *first-এ অ্যাসাইন করা হয়, তারপর পোস্ট ইনক্রিমেন্ট অপারেটর ব্যবহার করে ভ্যালু ব্যবহার করা হয়।
int arr[5] = {0}; char str[5] = {0}; itoa(arr, arr+5, 15); // it will generate {15, 16, 17, 18, 19} itoa(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