Introduction to STL Part-I

Ali Akber
4 min readJul 6, 2019

--

Vectors

C++ এর মাধ্যমে প্রব্লেম সল্ভিং করার একটি অন্যতম প্রধান টুল হল STL (Standard Template Library) । আমি যখন নতুন নতুন ডেটা স্ট্রকচার শিখি, তখন শুধু ভাবতাম কন্টেস্ট টাইমে এইগুলা কিভাবে ইমপ্লিমেন্ট করব। একটা ইমপ্লিমেন্ট করতে করতেই তো সব সময় চলে যাবে। পরবর্তীতে আমি STL এর পরিচয় পাই। প্রয়োজনীয় প্রায় সকল ডেটা স্ট্রাকচারই এইখানে ইমপ্লিমেন্ট করা আছে। শুধু তাই নয়, বেশ কিছু এলগরিদম ও এখানে ফাংশন হিসেবে পাওয়া যাবে। শুধু একটি ফাংশন কল করে সর্টিং এর মত ঝামেলার কাজও করা যাবে। মজার না? 😁

নতুন প্রোগ্রামারদের মধ্যে STL ব্যাবহারে কিছুটা ভীতি থাকে, কিন্তু এ ভীতি কাটিয়ে উঠতে হবে। STL এর প্রতিটি ফাংশন অনেক বেশি ইফিশিয়েন্ট এবং টাইম সেভার। আর এটি ব্যবহার করাও অনেক সোজা। একবার ব্যবহার করা শিখলে তখন সবকিছুতে শুধু STL ই ব্যবহার করবা 😎 তাহলে শুরু করা যাক? 😀

source: https://www.pinterest.com/pin/463730092881935997/

এই পোস্ট এ আমরা STL এর অনেক কমন একটা কন্টেইনার ক্লাস ‘VECTOR’ সম্পর্কে শিখব। ভেক্টরের কাজ অনেকটা ডায়নামিক অ্যারের মত। একটা নতুন ইলিমেন্ট অ্যাড করলে বা রিমুভ করলে ভেক্টর নিজে নিজেই রিসাইজ হতে পারে। আমরা ইন্টেজার টাইপের একটা অ্যারেতে যেমন অনেকগুলো ইন্টেজার রাখতে পারি, একইভাবে ইন্টেজার টাইপের একটা ভেক্টরে আমরা অনেকগুলো ইন্টেজার ভ্যারিয়েবল রাখতে পারবো। এর জন্য প্রথমে আমাদের ভেক্টরটিকে ডিক্লেয়ার করতে হবে।

vector <int> v;

ভেক্টর ব্যবহার করার আগে অবশ্যই ভেক্টরের হেডার ফাইল include করে নিতে হবে । আমি সাধারণত আলাদা আলাদা হেডার ফাইল include না করে #include<bits/stdc++.h> দিয়ে দেই। এতে করে ঝামেলা ও কমে, সময় ও বাচে।

ভেক্টরের বেশ কিছু বিশেষ সুবিধা রয়েছে যা সাধারণ অ্যারেতে নেই। একে একে দেখা যাক সেগুলো।

  • ভেক্টরের একটি অন্যতম সুবিধা হচ্ছে এতে পেছন দিক থেকে ইলিমেন্ট অ্যাড করা যায়। এর জন্য আমাদের শেষের ইনডেক্সটি জানতে হবে না। শুধু নিচের ফাংশনটি কল করলেই ভেক্টরের শেষে একটি করে নতুন ইলিমেন্ট যুক্ত হবে।

v.push_back(10);

v.push_back(5);

v.push_back(13);

  • ভেক্টরের সাইজ জানতে আমরা v.size() ফাংশনটি কল করতে পারি। এ ফাংশনটি ভেক্টরটির ইলিমেন্ট সংখ্যা রিটার্ন করে।
  • একটি ভেক্টর খালি কিনা তা v.empty() ফাংশনটির মাধ্যমে জানা যায়। ভেক্টরটি খালি হলে এটি true রিটার্ন করবে আর না হলে false ।
  • একটি ভেক্টরের কোন উপাদানকে এক্সেস করতে reference operator [] ব্যবহার করতে পারবো। আবার at(index) এর মাধ্যমেও একই কাজ করা যায়।

x = v[0]; //x has the 0'th element
y = v.at(0); //y has the 0'th element

  • কোন ভেক্টর থেকে সবগুলো ইলিমেন্ট মুছে ফেলতে v.clear() ফাংশনটি ব্যবহার করা যায়।

v.clear();
cout<<v.size()<<endl; //output is 0

  • ভেক্টরের কোনো নির্দিষ্ট একটি পজিশনে একটি ইলিমেন্ট ইন্সারট করতে আমরা v.insert(position,val) ব্যবহার করতে পারি। এইখানে (positon-1) তম স্থানে val ইলিমেন্টটি যুক্ত হবে।

v.insert(v.begin()+2,10);
cout<<v[1]<<endl; //prints 10

তোমরা অনেকে হয়ত দেখে অবাক হচ্ছো v.begin()+2 কেন লিখলাম। v.begin() একটি ইটারেটর রিটার্ন করে। এটি ভেক্টরের প্রথম ইলিমেন্ট এর অ্যাড্রেস নির্দেশ করে। সহজ ভাষায় এটি একটি পয়েন্টার জাতীয় ভ্যারিয়েবল। আমাদের ভেক্টরটি শুরু হয়েছে v.begin() থেকে। v.begin()+2 মানে ভেক্টরের ৩য় ঘর। যেহেতু insert() ফাংশনটি এক ঘর আগে insert করে সেহেতু ২য় ঘরটিতে 10 ভ্যালুটি যুক্ত হয়েছে।

ভেক্টরের এ সকল অপারেশনের আরও উদাহরণ দেখতে চাইলে এই কোডটি দেখতে পারো।

আমরা চাইলে 2D ভেক্টর ও তৈরী করতে পারি। এর জন্য আমাদেরকে ভেক্টরের অ্যারে তৈরী করতে হবে। এক্ষেত্রে আমাদের রো সংখ্যা আগে থেকে বলে দিতে হবে।

vector <int> v[10];

উপরের ডিক্লারেশনটি ১০ টি ভেক্টরের একটি অ্যারে তৈরী করবে। আমরা প্রতিটি ভেক্টরকে v[position] এর মাধ্যমে এক্সেস করতে পারবো এবং এর উপর ভেক্টরের সকল অপারেশন চালাতে পারবো। একটি ভেক্টরের নির্দিষ্ট স্থানের কোনো ইলিমেন্টকে এক্সেস করতে v[row][column] এই ফরম্যাট ব্যবহার করব।

v[1][5]; //access the 6th element of the 2nd vector

2D ভেক্টরের উদাহরণ দেখতে এই কোডটি দেখতে পারো

আমরা ইন্টেজার, ফ্লোট, ডাবল, ক্যারেক্টার যেকোনো টাইপের এমনকি কোন ক্লাস এর অবজেক্ট টাইপেরও ভেক্টর ব্যবহার করতে পারবো। ভেক্টর টাইপের ও ভেক্টর ব্যবহার করা সম্ভব। এটা তোমাদের জন্যে বাড়ির কাজ রইল 😉 ।

এতক্ষণ যা পড়লে তার সবই ছিল ভেক্টরের বেসিক। এগুলো ছাড়াও ভেক্টরের আরও অনেক ফাংশন আছে। উপরের ফাংশনগুলো ভালোমতো শেখা হয়ে গেলে তোমরা ভেক্টর নিয়ে আরও ঘাটিয়ে দেখতে পারো।

STL সিরিজটা কন্টিনিউ করব কি না তা পাঠকদের রেসপন্স এর উপর ডিপেন্ড করে। এই পোস্টটা কেমন লাগলো এবং আগামীতে এই সিরিজের আরও লেখা পড়তে চাইলে অবশ্যই কমেন্ট করে জানাবে। সম্পূর্ণ পোষ্টটি পড়ার জন্য সকলকে ধন্যবাদ।

--

--