Vector [note]
Iterators
begin() and end()
নাম দেখেই বুঝতেছো begin = শুরু; end = শেষ। অর্থাৎ একটা ভেক্টরের শুরুর এলিমেন্ট কে begin() এবং শেষ এলিমেন্টকে নির্দেশ করে end()
vector<int> v = {1, 2, 3, 4, 5};
vector<int>::iterator it;
it = v.begin();
cout << "first element: " << *it << '\n';
it = v.begin() + 1;
cout << "second element: " << *it;
it = v.end() - 1;
cout << "\nlast element: " << *it;
আরেকটি উদাহরণঃ
vector<int> v = {1, 2, 3, 4, 5};
vector<int>::iterator it;
for (it = v.begin(); it != v.end(); it++) {
cout << *it << ' ';
}
or
vector<int> v = {1, 2, 3, 4, 5};
for (auto it = v.begin(); it != v.end(); it++) {
cout << *it << ' ';
}
তোমার মনে প্রশ্ন আসতে পারে যে ভেক্টরের এলিমেন্ট গুলো কি পরিবর্তন করা সম্ভব ? উত্তর হচ্ছে জি, সম্ভব। নিচের প্রোগামটি দ্যাখো।
vector<int> v = {1, 2, 3, 4, 5};
auto it = v.begin();
*it = 10;
cout << *it << '\n';
for (auto it = v.begin(); it != v.end(); it++) {
cout << *it << ' ';
}
rbegin(), rend()
তুমি যদি ভেক্টরের এলিমেন্ট গুলোকে রিভার্স অর্ডারে প্রিন্ট করতে চাও তাহলে rbegin() এবং rend() এই মেথড দুটি তোমার লাগবেই।
vector<int> v = {1, 2, 3, 4, 5};
for (auto it = v.rbegin(); it != v.rend(); it++) {
cout << *it << ' ';
}
cbegin(), cend()
এগুলো হচ্ছে কন্সট্যান্ট ইটারেটর। কন্সট্যান্ট মানেই বুঝতেছো এটা অপরিবর্তিত। অর্থাৎ যখন তুমি ইটারেট করবে মান গুলোর কোন পরিবর্তন করতে পারবে না। এটা তখন ই তোমার কাজে দিবে যখন তুমি চাইবে যে একটা ভেক্টর ইটারেট করবার সময় এলিমেন্ট গুলো যেন অপরিবর্তিত থাকে।
vector<int> v = {1, 2, 3, 4, 5};
auto it = v.cbegin();
*it = 12;
cout << *it << '\n';
// এভাবে তুমি যদি মান পরিবর্তন করতে চাও তাহলে কম্পাইলার এরর থ্রো করবে।
vector<int> v = {1, 2, 3, 4, 5};
for (auto it = v.cbegin(); it != v.cend(); it++) {
cout << *it << ' ';
}
crbegin(), crend()
কনস্ট্যান্ট রিভার্স সিস্টেম
vector<int> v = {1, 2, 3, 4, 5};
for(auto it = v.crbegin(); it != v.crend(); it++) {
cout << *it << ' ';
}
Capacity
size()
ভেক্টরের সাইজ জেনে নিতে এই size() মেথড সাহায্য করে।
vector<int> v = {1, 2, 3, 4, 5};
cout << v.size();
max_size()
vector<int> v;
cout << v.max_size();
resize()
vector<int> v = {1, 2, 3};
v.resize(5);
for (auto e : v) {
cout << e << ' ';
}
//1 2 3 0 0
vector<int> v = {1, 2, 3};
// resize with specific value
v.resize(5, 7);
for (int e : v) {
cout << e << ' ';
}
// 1 2 3 7 7
capacity()
মেমোরিতে ভেক্টরের বর্তমান ক্যাপাসিটি জানতে capacity() মেথড সাহায্য করে।
vector<int> v;
cout << "initial capacity: " << v.capacity() << '\n';
v.push_back(1);
v.push_back(2);
v.push_back(3);
cout << "capacity with elements: " << v.capacity() << '\n';
empty()
একটি ভেক্টর ফাঁকা কি না সেটা চেক করতে empty() মেথড ব্যবহার করা হয়।
vector<int> v;
if (v.empty()) {
cout << "Empty vec\n";
}
else {
cout << "Not empty vec\n";
}
reserve()
তুমি যদি মেমোরি এলোকেশনে খুঁতখুঁতে হও তাহলে reverse() মেথড তোমার বন্ধু হতে পারে। যদি তুমি চাও একটা ভেক্টরের সাইজ যা দিবে ভেক্টরটি সে সাইজেই সীমাবদ্ধ থাকবে তাহলে reverse() ব্যবহার করাই ভাল। নিচের উদাহরণ দুটি দেখে নাও এবং নিজেও প্রোগ্রাম রান করে বুঝার চেষ্টা করো।
vector<int> v;
cout << "initial capacity: " << v.capacity() << '\n';
v.reserve(5);
cout << "after reserve: " << v.capacity() << '\n';
// let's add five elements
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
v.push_back(5);
cout << "size after adding elements: " << v.size() << '\n';
cout << "capacity after adding elements: " << v.capacity << '\n';
// output:
/*
initial capacity: 0
after reserve: 5
size after adding elements: 5
capacity after adding elements: 5
*/
// without reserve()
vector<int> v;
cout << "initial capacity: " << v.capacity() << '\n';
cout << "after reserve: " << v.capacity() << '\n';
// let's add five elements
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
v.push_back(5);
cout << "size after adding elements: " << v.size() << '\n';
cout << "capacity after adding elements: " << v.capacity() << '\n';
/*
initial capacity: 0
after reserve: 0
size after adding elements: 5
capacity after adding elements: 8
*/
shrink_to_fit()
মনে করো তুমি একটা ভেক্টরের সাইজ ১০ হিসেবে রিজার্ভ করলে। তারপর তুমি ভেক্টরটিতে দশের কম এলিমেন্ট পুষ করলে। ধরলাম ৫ টি এলিমেন্ট তুমি ভেক্টরটিতে পুশ করলে। তাহলে এখন ও ৫ টি এলিমেন্ট এর স্পেস থাকলো না ? ভেক্টরে ? ওই এক্সট্রা ৫ টি এলিমেন্ট এর ফাকা জায়গাটা shrink_to_fit() মেথড কমিয়ে ফেলে।
উদাহরণ দেখলেই বুঝতে পারবে।
// before using shrink_to_fit()
vector<int> v;
v.reserve(10);
for (int i = 0; i < 5; i++) {
v.push_back(i);
}
cout << "current size: " << v.size() << "\ncurrent capasity: " << v.capacity() << '\n';
cout << "capacity after shrink_to_fit: " << v.capacity() << '\n';
/*
output::
current size: 5
current capasity: 10
capacity after shrink_to_fit: 10
*/
// after using shrink_to_fit()
vector<int> v;
v.reserve(10);
v.push_back(1);
cout << "current size: " << v.size() << "\ncurrent capasity: " << v.capacity() << '\n';
v.shrink_to_fit();
cout << "capacity after shrink_to_fit: " << v.capacity() << '\n';
/*
output::
current size: 5
current capasity: 10
capacity after shrink_to_fit: 5
*/
Accessing Elements
operator[]
vector<int> v = {1, 2, 3};
cout << v[0] << '\n';
cout << v[1] << '\n';
cout << v[2] << '\n';
at()
vector<int> v = {1, 2, 3};
cout << v.at(1) << '\n';
Subscribe to my newsletter
Read articles from Torikus directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by