২-০ঃ সূচনা
সবাইকে STL এর প্রথম মডিউলে স্বাগতম। STL হলো সি++ এর একটি পাওয়ারফুল লাইব্রেরি , যেখানে আমরা কিছু কি ওয়ার্ড ব্যবহার করে খুব সহজে অনেক কমপ্লেক্স ডেটা স্ট্রাকচার এবং এলগরিদম ইমপ্লিমেন্ট করে ফেলতে পারি।
এই মডিউল শেষে আমরা যা যা শিখতে পারবোঃ
- ভেক্টর কি তা জানতে পারবো
- ভেক্টর কীভাবে initialize করতে হয় তা জানবো
- ভেক্টর এর Constructor গুলা সম্পর্কে জানবো
- ভেক্টর এর Capacity,Modifiers Related ফাংশন গুলা সম্পর্কে জানবো
- ভেক্টর কীভাবে Access করতে হয় এবং Iterator কীভাবে কাজ করে তা সম্পর্কে জানবো
- Vector কীভাবে ইনপুট নিতে হয় তা সম্পর্কে জানবো
- স্ট্রিং এর ভেক্টর সম্পর্কে জানবো
২-১ঃ ভেক্টর ইনিশিয়ালাইজেশন এবং কন্সট্রাক্টর
ভেক্টর হলো মূলত এক ধরনের Array। কিন্তু ভেক্টর সুপার পাওয়ার রয়েছে। সুপার পাওয়ার টা হলো আমরা চাইলে এই ভেক্টর এর সাইজ নিজের ইচ্ছা মতো যখন ইচ্ছা তখন পরিবর্তন করতে পারি। অর্থাৎ , নতুন কোন ভ্যালু এড করতে পারবো এবং ভ্যালু ডিলিট করতে পারবো। এর জন্য নরমাল এরে এর মতো অন্য কোন এক্সট্রা স্পেস নিতে হবে না। তাহলে আমরা জানলাম ।
ভেক্টর হলো Dynamic Array যার সাইজ আমরা নিজের প্রয়োজন মতো বাড়াতে পারবো / কমাতে পারবো। অর্থাৎ ভেক্টরের মধ্যে খুব সহজে নতুন ভ্যালু এড করতে পারবো এবং ভ্যালু ডিলিট করতে পারবো । যা আমরা একটি Array এর মতো ইন্ডেক্স ব্যবহার করে খুব সহজে এক্সেস করতে পারবো। এখানেও Array এর মতো 0 index হতে মান শুরু হয়
ভেক্টর কেনো প্রয়োজন তা আমরা শিখে ফেলেছি। আসেন এইবার কীভাবে কোডে ইমপ্লিমেন্ট করতে হয় তা শিখে নিই। ভেক্টর ব্যবহার করতে হলে আমাদের আগে ভেক্টর ডিক্লেয়ার / ইনিশিয়ালাইজ করে নিতে হবে। আসেন প্রয়োজন অনুসারে ভেক্টর ইনিশিয়ালাইজেশনের বিভিন্ন টাইপ দেখে নেয়া যাক।
১ম টাইপঃ
যদি আমরা না জানি initially আমাদের ভেক্টর এর সাইজ কতো হবে সেই ক্ষেত্রে আমরা কোন সাইজ ছাড়া ভেক্টর ডিক্লেয়ার করবো। এইক্ষেত্রে ভেক্টর টি মেমরি তে ০ সাইজের একটি জায়গা দখল করে নিবে , যা পরবর্তীতে ভ্যালু এড হতে হতে বাড়তে থাকবে। নিচের মতো প্রথমে vector keyword ব্যবহার করে কোন টাইপের ডেটা রাখতে চাচ্ছেন তার ডাটা টাইপ দিতে হবে এবং ঐ ভেক্টরের নাম দিতে হবে।
Type 1 :
vector< data_type > vector_name ;
Code :
vector<int> v ; // এর মাধ্যমে ইন্টিজার ডাটা টাইপের একটি ভেক্টর তৈরি হবে
vector<char> v ; // এর মাধ্যমে ক্যারেক্টার ডাটা টাইপের একটি ভেক্টর তৈরি হবে
vector<float> v ; // এর মাধ্যমে ফ্লোট ডাটা টাইপের একটি ভেক্টর তৈরি হবে
vector<long long> v ; // এর মাধ্যমে লং লং ইন্টিজার ডাটা টাইপের একটি ভেক্টর তৈরি হবে২য় টাইপঃ
আমরা যদি আগে থেকেই আমাদের কী পরিমাণ ডাটা দেয়া থাকবে তা জানতে পারি , তবে সেক্ষেত্রে আমরা একটি নির্দিষ্ট সাইজের ভেক্টর ডিক্লেয়ার করতে পারবো। এই ক্ষেত্রে ভেক্টর টি মেমরি তে নির্দিষ্ট সাইজের জায়গা দখল করে নিবে। এবং ভ্যালু ইনপুট না দেয়া পর্যন্ত কিছু গারবেজ ভ্যালু রেখে দিবে। পরবর্তীতে চাইলে আমরা ভেক্টর টির সাইজ বাড়াতে বা কমাতে পারবো। নিচের মতো প্রথমে vector keyword ব্যবহার করে কোন টাইপের ডেটা রাখতে চাচ্ছেন তার ডাটা টাইপ দিতে হবে এবং ঐ ভেক্টরের নাম দিতে হবে এবং একই সাথে ভেক্টরের সাইজ টা দিয়ে দিতে হবে।
Type 2 :
vector< data_type > vector_name (size) ;
Code :
vector<int> v (100) ; // এর মাধ্যমে 100 সাইজের ইন্টিজার ডাটা টাইপের একটি ভেক্টর তৈরি হবে
vector<char> v (50) ; // এর মাধ্যমে 50 সাইজের ক্যারেক্টার ডাটা টাইপের একটি ভেক্টর তৈরি হবে
vector<float> v (30) ; // এর মাধ্যমে 30 সাইজের ফ্লোট ডাটা টাইপের একটি ভেক্টর তৈরি হবে
vector<long long> v (40) ; // এর মাধ্যমে 40 সাইজের লং লং ইন্টিজার ডাটা টাইপের একটি ভেক্টর তৈরি হবে৩য় টাইপঃ
আমরা যদি আগে থেকেই আমাদের কী পরিমাণ ডাটা দেয়া থাকবে তা জানতে পারি, তবে সেক্ষেত্রে আমরা একটি নির্দিষ্ট সাইজের ভেক্টর ডিক্লেয়ার করতে পারবো। ভেক্টর টি মেমরি তে নির্দিষ্ট সাইজের জায়গা দখল করে নিবে। এবং আমরা গারবেজ ভ্যালু এর পরবর্তীতে আমাদের পছন্দের ভ্যালু দিয়ে ঐ জায়গা গুলো পূরণ করতে পারবো । পরবর্তীতে চাইলে একই সাথে আমরা ভেক্টর টির সাইজ বাড়াতে বা কমাতে পারবো। নিচের মতো প্রথমে vector keyword ব্যবহার করে কোন টাইপের ডেটা রাখতে চাচ্ছেন তার ডাটা টাইপ দিতে হবে, ভেক্টরের নাম দিতে হবে, ভেক্টরের সাইজ দিতে হবে এবং একই সাথে ঐ ভেক্টরের প্রত্যেকটি ভ্যালু কি দিয়ে ইনিশিয়ালাইজ করতে চাই তাও দিয়ে দিতে হবে।
Type 3 :
vector< data_type > vector_name (size,intitial_value) ;
Code :
vector<int> v (100,10) ; // এর মাধ্যমে 100 সাইজের ইন্টিজার ডাটা টাইপের একটি ভেক্টর তৈরি হবে যার প্রত্যেকটি ইন্ডেক্সের ভ্যালু হবে ১০
vector<char> v (50,'a') ; // এর মাধ্যমে 50 সাইজের ক্যারেক্টার ডাটা টাইপের একটি ভেক্টর তৈরি হবে যার প্রত্যেকটি ইন্ডেক্সের ভ্যালু হবে 'a'
vector<float> v (30,2.5) ; // এর মাধ্যমে 30 সাইজের ফ্লোট ডাটা টাইপের একটি ভেক্টর তৈরি হবে যার প্রত্যেকটি ইন্ডেক্সের ভ্যালু হবে ২.৫
vector<long long> v (40,100) ; // এর মাধ্যমে 40 সাইজের লং লং ইন্টিজার ডাটা টাইপের একটি ভেক্টর তৈরি হবে৪ তম টাইপঃ
যদি আমরা চাই একটি ভেক্টর কে একটি ভেক্টরের মধ্যে কপি করে নিতে তবে আমরা নিচের মতো করে কোড লিখতে পারি
vector < int > v1 = {1,2,3,4} ; // একটি ভেক্টর ডিক্লেয়ার করে সেখানে এই ভ্যালু গুলা দিয়ে ইনিশিয়ালাইজ করলাম
vector < int > v2(v1) ; // আরেকটি ভেক্টর v2 তে v1 এর সকল ভ্যালু সমূহ কপি হয়ে যাবে।
// একই ভাবে আমরা array ও কপি করতে পারবো।
int array[5] = {1,2,3,4,5} ;
vector<int> copy_vector(array,array+5) ; // array er সব ভ্যালু এই ভেক্টরে কপি হয়ে যাবেগুরুত্বপূর্ণ বিষয়ঃ
Array এর মতো ইন্ডেক্স ব্যবহার করে মান এসাইন করা যায়ঃ
v[20] = 10 ; // ভেক্টর v এর ২০ নাম্বার ইন্ডেক্স এর ভ্যালু ১০ এসাইন হয়ে যাবে।
২-২ঃ ভেক্টর ক্যাপাসিটি ফাংশন
আমাদের প্রয়োজন অনুসারে আমাদের বর্তমান ভেক্টর টির সাইজ কতো তা জানতে হতে পারে। সেক্ষেত্রে আমরা কিছু বিল্ট ইন ফাংশন ব্যবহার করে খুব সহজে ভেক্টরটির সাইজ বের করে ফেলতে পারি
১। v.size() -> এই ফাংশনের মাধ্যমে আমরা O(1) টাইম কমপ্লেক্সিটি তে ভেক্টর এর সাইজ জানতে পারবো
vector< int > v(10) ;
cout << v.size() << endl ; // returns 10 .২। v.max_size() -> এই ফাংশনের মাধ্যমে একটি ভেক্টর ম্যক্সিমাম কত সাইজের হতে পারে তার সম্পর্কে আমরা ধারণা পেতে পারি
vector< int > v ;
cout << v.max_size() << endl ; // এটি একটি ১০^৯ এর কাছাকাছি একটি ভ্যালু রিটার্ন করে .
// তবে অনলাইন জাজের ক্ষেত্রে সাইজ টি এত বেশি হবে না।ভেক্টরের ভ্যালু মুছে ফেলাঃ
মাঝে মাঝে আমাদের ভেক্টরটি তে যা যা আছে তা মুছে ফেলার প্রয়োজন হয়। এই ক্ষেত্রে আমরা একটি বিল্ট ইন ফাংশন ব্যবহার করতে পারি তা হলো v.clear() ফাংশন। এই ফানশনের সাহায্যে আমরা O(N) কমপ্লক্সিটি এর সাহায্যে ভেক্টরের সব ভ্যালু গুলা মুছে দিতে পারি। এই ক্ষেত্রে সে ভ্যালু গুলা মুছে দিয়ে সাইজ ০ করে দেয় কিন্তু মেমরি গুলা ক্লিয়ার করে না
vector < int > v1 = {1,2,3,4} ; // একটি ভেক্টর ডিক্লেয়ার করে সেখানে এই ভ্যালু গুলা দিয়ে ইনিশিয়ালাইজ করলাম
cout << v1.size() << endl ; // যেহেতু এখানে ৪ টি ভ্যালু আছে তাই এই ভেক্টরের সাইজ ৪ রিটার্ন করবে
v1.clear() ; // ভেক্টরটি ক্লিয়ার করা হলো
cout << v1.size() << endl ; // ভেক্টর টি ক্লিয়ার করার কারণে তার সাইজ ০ প্রিন্ট হবে
cout << v1[1] << endl ; // যেহেতু মেমরি গুলা ক্লিয়ার করে না তাই আমরা চাইলে ইন্ডেক্স ব্যবহার করে ভ্যালু গুলা এক্সেস করতে পারবোআরো কিছু ফাংশনঃ
v.empty() -> এই ফাংশন ব্যবহার করে আমরা ভেক্টরটি খালি কিনা চেক করতে পারবো। ভেক্টর খালি হলে ফাংশন টি ১( true) রিটার্ন করে খালি না হলে 0 ( false) রিটার্ন করে
vector < int > v1 = {1,2,3,4} ; // একটি ভেক্টর ডিক্লেয়ার করে সেখানে এই ভ্যালু গুলা দিয়ে ইনিশিয়ালাইজ করলাম
cout << v1.empty() << endl ; // ০ প্রিন্ট হবে কারণ v1 খালি নয়
v1.clear() ; // ভেক্টরটি খালি করা হলো
cout << v1.empty() << endl ; // ১ প্রিন্ট হবে কারণ v1 খালি।v.resize() -> এই ফাংশনের সাহায্যে প্রোগ্রাম এর রান টাইম এ আমরা ভেক্টর সাইজ কে পরিবর্তন করতে পারি। এই ক্ষেত্রে ভেক্টরের যে অংশগুলোতে ভ্যালু ছিলো তা ঠিক মতো থাকবে, এবং বাকি ঘর গুলো ০ দিয়ে ইনিশিয়ালাইজ হবে। চাইলে আমরা v.size(new_size, desired_value) ব্যবহার করে বাকি পজিশন গুলাতে নিজের ইচ্ছা অনুযায়ী ভ্যালু ও সেট করতে পারি। v.resize(new_size) ফাংশনের টাইম কমপ্লেক্সিটি O( new_size - previous_size ) ;
vector<int> v1 = {1, 2, 3, 4} ; // একটি ভেক্টর ডিক্লেয়ার করে সেখানে এই ভ্যালু গুলা দিয়ে ইনিশিয়ালাইজ করলাম
for (int i = 0; i < v1.size(); i++)
{
cout << v1[i] << " ";
} // 1 2 3 4 প্রিন্ট করবে
v1.resize(10) ; // ভেক্টরের সাইজ পরিবর্তন করে ১০ করে দিবে
for (int i = 0; i < v1.size(); i++)
{
cout << v1[i] << " ";
} // 1 2 3 4 0 0 0 0 0 0
// যেহেতু ৪ নাম্বার পজিশন পর্যন্ত ভ্যালু ছিলো তা ঠিক মতো আছে, বাকি সব পজিশন ০ ভ্যালু দিয়ে ইনিশায়ালাইজ করেছে
v1.resize(10,100) ; // ভেক্টরের সাইজ পরিবর্তন করে ১০ করে দিবে এবং বাকি ভ্যালু গুলা ১০০ দিয়ে ইনিশিয়ালাইজ২-৩ঃ ভেক্টর মডিফাইয়ার ফাংশন -১
এই পেইজে আমরা একটি ভেক্টর কে কীভাবে বিভিন্ন ফানশনের সাহায্যে মডিফাই করা যায় তা দেখবো।
ভেক্টর কে মডিফাই করার বিভিন্ন ফাংশনঃ
১। ভেক্টর এসাইনঃ আমরা চাইলে একটি ভেক্টর এ আরেকটি ভেক্টর এসাইন করতে পারি। যদি ঐ দুইটি ভেক্টরের সাইজ সমান হয় , সেক্ষেত্রে এই এসাইনের টাইম কমপ্লেক্সিটি হবে O(1) , অন্যথায় এর টাইম কমপ্লেক্সিটি হবে O(N)
vector<int>v = {1,2,3,4} ;
vector<int> v1 ;
v1 = v ; // v1 এর মধ্যে v er সব ভ্যালু এসাইন হয়ে যাবে।২। push_back() -> এই ফাংশনের মাধ্যমে আমরা ভেক্টরের শেষের দিকে একটি ভ্যালু insert করতে পারি । একটি ভ্যালু insert করার পর vector টির সাইজ ১ বেড়ে যাবে। এই ফাংশনের টাইম কমপ্লেক্সিটি হলো O(1).

vector<int>v = {1,2,3,4} ;
v.push_back(6) ; // ডান সাইডে ভ্যালু ৬ insert করবে
for(int i =0 ;i<v.size();i++) {
cout << v[i] << endl ;
} // 1 2 3 4 5 6৩। pop_back() -> এই ফাংশনের সাহায্যে আমরা ভেক্টরের সর্ব ডানের ভ্যালুটি ডিলিট করতে পারি। ভ্যালু কমে যাওয়ার কারণে ভেক্টরের সাইজ ও ১ কমে যাবে। এই ফাংশনের টাইম কমপ্লেক্সিটি O(1).

vector<int>v = {5,6,7,8,9} ;
v.pop_back() ; // ডান সাইডে ভ্যালু 9 delete হয়ে যাবে
for(int i =0 ;i<v.size();i++) {
cout << v[i] << endl ;
} // 5 6 7 8৩। v.insert() : এই ফাংশনের সাহায্যে আমরা ভেক্টরের যেকোন index এ ভ্যালু এড করতে পারবো। এই ফাংশনের টাইম কমপ্লেক্সিটি হলো O(N+K) যেখানে N হলো ভেক্টরের সাইজ এবং K হলো আমরা কয়টি ভ্যালু insert করবো তার সংখ্যা। ধরেন আমরা চাচ্ছি আমাদের ভেক্টরের k তম index ভ্যালু ১০ এড করতে। এই ক্ষেত্রে আমরা লিখবো , তার index এবং তার ভ্যালু। এরপর আমি যদি চাই , একটি index থেকে শুরু করে আরেকটি ভেক্টর এখানে insert করতে এই ক্ষেত্রে আমরা ফাংশনে ভেক্টরের index , এবং আরেকটি ভেক্টর এর শুরু এবং শেষের পয়েন্টার টা দিয়ে দিবো। নিচে ভেক্টরে কোন একটি ইন্ডেক্সের পজিশন কীভাবে বের করা যায় তা চিত্রে দেখানো হলো

vector<int>v = {5,6,7,8,9} ;
v.insert( v.begin() +2 , 10 ) // ভেক্টর টির ২ নাম্বার index ১০ insert হয়ে যাবে।
for(int i =0 ;i< v.size();i++) {
cout << v[i] << " " ;
}
// 5 6 10 7 8 9
vector<int> v2 = {100,1000} ;
v.insert( v.begin() +3, v2.begin(),v2.end() ) // এর মাধ্যমে ভেক্টর v এর ৩ নাম্বার পজিশন থেকে v2 insert হয়ে যাবে
// v হবে 5 6 10 100 1000 7 8 9৪। v.erase() -> এই ফাংশনের সাহায্যে আমরা ভেক্টরের কোন একটি ইন্ডেক্সের ভ্যালু ডিলিট করতে পারি। এর জন্য এই ফাংশনে ঐ ইন্ডেক্সের পয়েন্টার টি পাস করে দিতে হবে। আমরা যদি চাই একটি রেঞ্জের সকল ভ্যালু গুলা ডিলিট করতে তবে erase ফাংশনের মধ্যে যে ভ্যালু থেকে শুরু করতে চাই তবে এই ক্ষেত্রে ঐ রেঞ্জের শুরুর ইন্ডেক্সের পয়েন্টার এবং ঐ রেঞ্জের শেষের ইন্ডেক্সের পয়েন্টার পাস করতে হবে।
vector<int>v = {5,6,7,8,9} ;
v.erase(v.begin() +2) // ভেক্টর টির ২ নাম্বার index ১০ insert হয়ে যাবে।
for(int i =0 ;i< v.size();i++) {
cout << v[i] << " " ;
}
// 5 6 8 9
vector<int>v2 = {1,2,3,4,5} ;
v2.erase(v2.begin() +1, v2.begin() +3) // ১ নাম্বার ইন্ডেক্স থেকে ৩ নাম্বার ইন্ডেক্সের ভ্যালু গুলা ডিলিট করে দিবে
// v2 হবে 1 5২-৪ঃ ভেক্টর মডিফাইয়ার ফাংশন -২
এই পেজে আমরা শিখবো কীভাবে ভেক্টরের ভ্যালু গুলা বিল্টইন ফাংশনের সাহায্যে রিপ্লেস করা যায় বা কোন একটি নির্দিষ্ট ভ্যালু খুজে বের করা যায় ।
আসেন কিছু পাওয়ারফুল বিল্ট ইন ফাংশন সম্পর্কে জেনে নেয়া যাক।
১। replace() -> এই ফাংশনের সাহায্যে আমরা vector এর কোন একটি নির্দিষ্ট রেঞ্জের একটি নির্দিষ্ট ভ্যালুকে অন্য একটি ভ্যালু দিয়ে রিপ্লেস করে দিতে পারি। এই ফাংশনের টাইম কমপ্লেক্সিটি হলো O(N) .
Syntax : replace(v.begin() , v.end() , target_value , change_value)
vector<int>v = {1,2,3,4,7,6,4,5,4,3,4} ;
replace(v.begin() , v.end() , 4, 100) // এই ফাংশন টি ভেক্টরের যে যে স্থানে ভ্যালু 4 আছে তা চেঞ্জ করে 100 করে দিবে
for(int i =0 ;i<v.size();i++) {
cout << v[i] << endl ;
} // Output : 1 2 3 100 7 6 100 5 100 3 100২। find() -> এই ফাংশনের সাহায্যে আমরা ভেক্টর এর কোন একটি ভ্যালু আছে কিনা খুজে দেখতে পারি। এই ফাংশন আমাদের একটি ইটারেটর রিটার্ন করে যা ঐ ভ্যালুটির ইন্ডেক্সে পয়েন্ট করা থাকে, আর যদি ভ্যালুটি খুজে না পায় তবে v.end() এ পয়েন্ট করে থাকে । এই ফাংশনের টাইম কমপ্লেক্সিটি হলো O(N).
Syntax : find(v.begin() , v.end() , target_value )
vector<int>v = {1,2,3,4,7,6,4,5,4,3,4} ;
auto it = find(v.begin() , v.end() , 6) ; // ৬ ভ্যালুটি ভেক্টরের মধ্যে পেলে প্রথম যে জায়গায় ভ্যালুটি আছে তার ইটারেটর টা রিটার্ন করা হবে
if( it != v.end()) { // যদি ভ্যালুটি পাওয়া না যায় তবে it তে v.end() স্টোর হবে।
cout << "found the value " << *it << endl } // যেহেতু ইটারেটর একটি পয়েন্টার এর মতো কাজ করে , তাই আমরা it কে dereferencing করে তার ভ্যালু দেখতে পারবো
else {
cout << "not found" << endl ;
}২-৫ঃ ভেক্টর এক্সেস এবং ইটারেটর
নিচে ভেক্টর এক্সেস এর কিছু ওয়ে কোড করে দেখানো হলো
vector <int> v = { 1, 2 ,3 ,4 ,5 ,6 } ;
v [1] = 10 ;
cout << v[2] << endl ; // 3
cout << v.front() << endl ; //1
cout << v.back() << endl ; // 6৩ এবং ৫ নং লাইনে এরে এর মতো করে ইনডেক্স ব্যবহার করে ভ্যালু এক্সেস করা যাবে এবং তা মডিফাই এবং প্রিন্ট করা যাবে।
৭ নাম্বার লাইনে ভেক্টরের সাথে .front() ফাংশন কল করে আমরা ভেক্টর টির সামনের/ শুরুর ভ্যালুটি এক্সেস করতে পারবো।
৯ নাম্বার লাইনে ভেক্টরের সাথে .back() ফাংশন কল করে আমরা ভেক্টর টির শেষের ভ্যালুটি এক্সেস করতে পারবো
ইন্ডেক্স ছাড়াও আমরা আরেক ভাবে ভেক্টর এর সব গুলা এলিমেন্ট এক্সেস করতে পারি , আর তা হলো ভেক্টর ইটারেটর এর মাধ্যমে । ইটারেটর পয়েন্টার এর ন্যায় কাজ করে।
vector <int> v = { 1, 2 ,3 ,4 ,5 ,6 } ;
vector<int>::iterator it = v.begin() ;
cout << *it << endl ; // 1
auto it = v.begin() ; // auto keyword এর সাহায্যে সহজে ইটারেটর ডিক্লেয়ার করা যায়
while(it!=v.end()){
cout << *it << endl ;
it++ ;
}এখানে একটি ভেক্টর ইটারেটর ডিক্লেয়ার করা হয়েছে। এবং সেটি ভেক্টরের শুরুর ইন্ডেক্সে পয়েন্ট করা আছে এরপর ইটারেটর টি dereferencing করে ভ্যালুটি প্রিন্ট করা হয়েছে
এরপরে আরো সহজ পদ্ধতিতে ইটারেটর ডিক্লেয়ার হয়েছে এবং একটি while লুপের সাহায্যে যতক্ষন পর্যন্ত ভেক্টরের শেষ অর্থাৎ v.end() হচ্ছে না , ততক্ষন লুপ চলবে এবং ভেক্টর টির সব ভ্যালু প্রিন্ট করবে
২-৬ঃ ভেক্টরে ইনপুট নেয়া
ভেক্টরে সাধারণত দুইভাবে ইনপুট নেয়া যায়
১। সাইজ ছাড়া ভেক্টর ডিক্লেয়ার করলে
১ম টাইপঃ
int n ;
cin >> n ; // প্রথমে ভেক্টর এর সাইজ নেয়া হলো
vector < int > v ; // একটি ইন্টিজার ডাটা টাইপের ভেক্টর ডিক্লেয়ার করা হলো
for(int i =0 ;i<n ;i++) { // একটি n এর লুপ চালিয়ে ভ্যালু গুলা ইনপুট নেয়া হলো
int x ;
cin >> x ; // একটি ইন্টিজার ভ্যারিয়েবলে কারেন্ট এলিমেন্ট কে স্টোর করে রাখা হলো
v.push_back(x) ; // x ভ্যারিয়েবল এর মান টিকে ভেক্টর এ পুশ / একদম ডান পাশে insert করা হলো।
}২। সাইজ সহ ভেক্টর ডিক্লেয়ারেশনঃ সাইজ সহ ভেক্টর ডিক্লেয়ার করলে তা সম্পূর্ণ array এর মতো ইন্ডেক্স এর মতো
int n ;
cin >> n ; // প্রথমে ভেক্টর এর সাইজ নেয়া হলো
vector < int > v(n) ; // একটি ইন্টিজার ডাটা টাইপের n সাইজের ভেক্টর ডিক্লেয়ার করা হলো
for(int i =0 ;i<n ;i++) { // একটি n এর লুপ চালিয়ে ভ্যালু গুলা ইনপুট নেয়া হলো
cin >> v[i] ; // প্রতিটি ইন্ডেক্স এক্সেস করে সেখানে ভ্যালু গুলা ইনপুট নেয়া হলো।
}২-৭ঃ স্ট্রিং এর ভেক্টর
আমরা চাইলে ভেক্টর এর প্রত্যেকটি ঘরে একটি করে string রাখতে পারবো। এর জন্য আমাদের string data type এর একটি ভেক্টর ডিক্লেয়ার করতে হবে।
স্ট্রিং এর ক্ষেত্রে আমরা সাধারণত দুই ধরণের স্ট্রিং দেখি।
১। স্পেস ছাড়া স্ট্রিং
২। স্পেস সহ স্ট্রিং
প্রথমে দেখে নেয় স্পেস ছাড়া ইনপুটের ক্ষেত্রে কীভাবে ইনপুট নিতে হবে
Type 1 :
int n ; cin >> n ; // সাইজ ইনপুট
vector< string > v(n) ; // স্ট্রিং ডেটা টাইপের n সাইজের একটি ভেক্টর
for(int i =0 ;i<n ;i++) {
cin >> v[i] ; // ভেক্টরের প্রত্যেকটি ইন্ডেক্স এক্সেস করে স্ট্রিং গুলা ইনপুট নেয়া হচ্ছে
}এরপর স্পেস সহ স্ট্রিং ইনপুটের জন্য দেখে নেয় কীভাবে ইনপুট নিতে হয়ঃ
int n ; cin >> n ; // সাইজ ইনপুট
cin.ignore() ; // getline দিয়ে স্ট্রিং ইনপুট নিলে এর আগের ইন্টিজার ইনপুটের পরের ক্যারেক্টার ইগ্নোর করতে হয়
vector< string > v(n) ; // স্ট্রিং ডেটা টাইপের n সাইজের একটি ভেক্টর
for(int i =0 ;i<n ;i++) {
getline(cin,v[i]) ; // ভেক্টরের প্রত্যেকটি ইন্ডেক্স এক্সেস করে স্ট্রিং গুলা getline এর সাহায্যে ইনপুট নেয়া হচ্ছে
}এখন এই ভেক্টরের প্রতিটি ইন্ডেক্সে একটি করে স্ট্রিং স্টোর হয়ে যাবে। এরপর আমরা চাইলে ইন্ডেক্স টি এক্সেস করে ঐ স্ট্রিং নিয়ে কাজ করতে পারবো।
int n ; cin >> n ; // সাইজ ইনপুট
vector< string > v(n) ; // স্ট্রিং ডেটা টাইপের n সাইজের একটি ভেক্টর
for(int i =0 ;i<n ;i++) {
cin >> v[i] ; // ভেক্টরের প্রত্যেকটি ইন্ডেক্স এক্সেস করে স্ট্রিং গুলা ইনপুট নেয়া হচ্ছে
}
for(int i =0 ;i<n ;i++) {
cout << v[i] << " " ; // ভেক্টরের প্রত্যেকটি ইন্ডেক্স এক্সেস করে স্ট্রিং গুলা প্রিন্ট করা হচ্ছে
}
Input : 5
Shafiq Karim Nayeem Barkat Rafiq
Output : Shafiq Karim Nayeem Barkat Rafiq