UIU: Learn C++ STL by Examples : Vector


ভেক্টর হল Dynamic array; যেমন, আমরা যখন array declare করি তখন আমাদের সাইজ বলে দিতে হয়।


int array [10];

কিন্তু যদি এমন হয়, আমি আগের থেকেই জানি না সাইজ কত হতে পারে; তখন আমরা ভেক্টর ব্যবহার করতে পারি। ভেক্টর ব্যবহার করলে আগের থেকেই সাইজ বলে দেয়ার দরকার হয় না। প্রথমে আমাদের

১. ভেক্টর declare করতে হয়।
২. তারপর একটা একটা করে element যোগ করতে হয়। খুবই সহজ


vector <int> numbers;

numbers.push_back(5);
numbers.push_back(10);
numbers.push_back(15);

যেমন: এইখানে আমি একটা ভেক্টর ডিক্লেয়ার করলাম। এবং সেই ভেক্টরে প্রথমে ৫, তারপর ১০, তারপর ১৫ রাখলাম। অর্থ্যাৎ

ভেক্টরের ১ম এলিমেন্ট ৫
২য় এলিমেন্ট ১০
৩য় এলিমেন্ট ১৫

আমরা যতই এলিমেন্ট যোগ করতে থাকব, ততই ভেক্টর আস্তে আস্তে নিজেকে বড় করতে থাকবে। মানে ভেক্টরের সাইজ বাড়তে থাকবে। অ্যরেতে কিন্তু ঘটনা এরকম না। অ্যরেতে প্রথমেই সাইজ বলে দিতে হয় এবং ডিক্লেয়ার হবার সময়ই সে ওই পরিমান জায়গা নিয়ে বসে থাকে। কিন্তু ভেক্টর দরকার মত ছোট বা বড় হয়।

অবশ্যই ভেক্টর ডিক্লেয়ার করার সময় আমাদের বলে দিতে হবে যে, আমরা কি টাইপের ডেটা রাখতে চাই। এইখানে আমরা int টাইপের ভেক্টর ডিক্লেয়ার করলাম। ভেক্টর ব্যবহার করতে হলে একটা হেডার ফাইল লাগবে এবং সাথে একটা অতি গুরুত্বপূর্ণ লাইন লিখতে হবে।


#include <vector>

using namespace std;

অতি গুরুত্বপূর্ণ লাইনটা অতীব গুরুত্বপূর্ণ বিধায় আলোচনা করলাম না ( আমি নিজেও জানি না এইটার মানে কি 😦 ); আপাতত যেভাবে আছে সেভাবেই ব্যবহার করেন।

এবার দেখি আমাদের ভেক্টরের সাইজ কত? .. হুম, আমরা জানি ভেক্টরের সাইজ ৩ হবে। কারন, ৩ টা এলিমেন্ট আছে।


printf ("%lu\n", numbers.size());   // %lu = unsigned long

একটা মজার বিষয়। আপনারা কি জানেন, function এবং method-এর পার্থক্য কি?

উপস! প্রশ্নটা করে তো বিপদে পড়ে গেলাম। এখন কি আমাকে বুঝাইতে হবে function এবং method-এর পার্থক্য কি? ওহ খোদা!

function হইল function আর কি। আমরা function ব্যবহার করি না? সেটাই।
আর Object Oriented Programming-এ এই function গুলাকেই method বলে।

এইটা কিছু হইলো? Object Oriented Programming আবার কি জিনিস? এবং একই জিনিসকে কেউ function আবার কেউ method বলবে কেন? সমস্যা কি?

সমস্যা গুরুতর কিছু না। আসলে পার্থক্য হল, function-কে এমনি এমনি কল করা যায়। কিন্তু method-কে কল করতে হলে একটা অবজেক্ট লাগে। মানে, প্রথমে একটা অবজেক্ট, তারপরে একটা ডট, তারপরে method-এর নাম। যেমন,

numbers.size()

এইখানে numbers হল অবজেক্ট এবং size() হল মেথড।

size() যদি function হত তাহলে আমরা

size();

বললেই কাজ হত। কিন্তু size() আসলে মেথড। কার মেথড? numbers এর মেথড। তাই numbers এর সাথে size() কে কল করলে numbers এর সাইজ পাওয়া যায়। :/

যাউক, function এবং method এমন কোন গুরুত্ববহ বিষয় না যে এখনই বুঝতে হবে। তাই আপাতত এর আলোচনা বাদ। যেখানে ছিলাম সেখানে ফিরে যাই। 🙂

ঘটনা হইলো, numbers.size() কেন unsigned long return করে?

size তো আর int হতে পারে না। কারন, int তে negative and positive দুইধরনের সংখ্যাই রাখা যায়। size কখোনো negative হওয়া সম্ভব না। তাই size সবসময় unsigned; আর একটু আগেই বলছিলাম, ভেক্টরের সাইজ আগের থেকে বলে দিতে হয় না, দরকার মত বড় বা ছোট হয়। এখন বড় হতে হতে কিন্তু সাইজ অনেক অনেক বড় হতে পারে। তো অনেক বড় একটা সাইজ রাখার জন্য আমাদের জানামতে long ডেটাটাইপ আছে, তাই না?

যদিও এখন পর্যন্ত বেস্ট প্র্যাকটিস হল একটা অ্যারে / ভেক্টরের সাইজ 10^7 এর বেশি না হওয়া।


// @BEGIN_OF_SOURCE_CODE

#include <cstdio>
#include <vector>
#include <iostream>

using namespace std;

void print (vector <int> &v)
{
    for ( int i = 0; i < v.size(); i++ ) {
        printf ("%d ", v [i]);
    }

    printf ("\n");
}

void generate(vector <int> &v, int element)
{
    for ( int i = 0; i < element; i++ ) v.push_back(i * 10);
}

int main (int argc, char *argv [])
{
    vector <int> numbers;

    numbers.push_back(5);
    numbers.push_back(10);
    numbers.push_back(15);

    printf ("%lu\n", numbers.size());   // %lu = unsigned long

    printf ("%d\n", numbers [1]);

    printf("%d\n", numbers.back());

    printf("%d\n", numbers.front());

    numbers.clear();

    if (numbers.empty()) {
        printf ("numbers is an empty vector");
    }

    generate(numbers, 5);

    numbers.pop_back();

    numbers [0] = 1000;

    printf ("%d\n", *numbers.begin());

    printf ("%d\n", *numbers.end());

    numbers.insert(numbers.begin() + 1, 5);

    numbers.erase(numbers.begin() + 2);

    vector <int>::iterator it;

    for ( it = numbers.begin(); it != numbers.end(); it++ ) {
        printf ("%d\n", *it);
    }

    printf("%d\n", numbers.at(0));

    vector <int> numbers2 {10, 50, 20, 30, 70};

    vector <int> numbers3(5, 10);

    vector <int> numbers4 (10);

    return 0;
}

// @END_OF_SOURCE_CODE

2 thoughts on “UIU: Learn C++ STL by Examples : Vector

  1. আপনি মাল্টি ডাইমেনসনাল ভেকটর নিয়ে তো কিচ্ছু লিখলেন না………।

  2. @facebook,
    জ্বী, আমি জানি, মাল্টিডাইমেনশনাল ভেক্টর নিয়ে আমি কিচ্ছু লিখি নাই। এমনকি আমি সিঙ্গেলডাইমেনশনের সবগুলা মেথডও কভার করি নাই। আমার এতটুকুই লিখার পরিকল্পনা ছিল।

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s