Skip to main content

CPP তে map কেন এবং কিভাবে সেটা ব্যাবহার করতে হয়

C++ এর STL [ Standard Template Library ] এ কিছু কমন Data Structure ইমপ্লিমেন্ট করা আছে যেমন, vector, set, list, map, queue, deque, priority queue stack, bitset ইত্যাদি । এগুলো কে আমরা আমাদের প্রয়োজন অনুসাতে খুব সহজেই ব্যাবহার করেত পারি ।

আজকে আমরা এখানে map নিয়ে কিভাবে কাজ করা যায় সেটা নিয়ে আলোচনা করবো । কারণ উপরে আমরা যেগুলোর নাম লিখেছি তার মধ্যে map সবচেয়ে মজাদার ।

আমরা নিশ্চয় অ্যারে ব্যাবহার করেছি । অ্যারে তে আমরা কি করি ? আমরা অ্যারে এর টাইপ লিখি তারপর তার নাম দেই , তারপর তার সাইজ বলে দেই । আমাদের যদি ১০ সাইজ এর int টাইপ অ্যারে লাগে তখন আমরা লিখি

1
    int arr[10];

value রাখার জন্য এবং পরে সেগুলো প্রিন্ট করার জন্য আমরা আমাদের অ্যারে এর ইনডেক্স ব্যাবহার করি

1
2
3
4
5
6
7
8
    // for input
    for(int i = 0; i < array_size; i++) {
        cin >> arr[i];
    }
    // for output
    for(int i = 0; i < array_size; i++) {
        cout << arr[i] << endl;
    }

অ্যারে ইনডেক্স কিন্তু সবসময় int হতে হবে । ইনডেক্স কখনো double, float, string বা char হতে পারবে না । এখন আমাদের যদি এমন একটা অ্যারের দরকার হয় সেটার ইনডেক্স আমরা আমাদের ইচ্ছা মত [ string , char , int, double] দিতে পারব । তখন আমরা কি করবো ? এই ধরনের ক্ষেত্রে আমরা যদি map ব্যাবহার করি তবে খুব সহজেই সেটা করতে পারব :)

map কে declare করা জন্য আমাদের কে লিখতে হবে ।

1    
map < string, int > my_map;

এখানে প্রথমটাকে বলা হয় key বা index দ্বিতীয়টাকে বলা হয় value অর্থাৎ প্রতিটি key এর বিপরীতে একটা করে value থাকবে । এছাড়াও আমরা আমাদের প্রয়োজন মত আমাদের map declare করতে পারি যেমন :

1    
2
3
4
map <int, int> ii_map;
map <string, string> ss_map;
map <int, string> is_map;
map <string, double > sd_map;

এখন আমরা আমাদের ম্যাপ   map < string, int > my_map; এ ডাটা রাখতে চাই তার জন্য আমাকে এই ভাবে লিখতে হবে ।

1
2
3
4
   // insert value into map
   my_map["BRUR"] = 2009;
   my_map["CSE"] = 2016;
   my_map["Bangladesh"] = 1971;

আমরা যে ডাটা দিলাম সেগুলো প্রিন্ট করা জন্য লিখতে হবে

1
2
3
4
   // print value
   cout << my_map["BRUR"] << endl;
   cout << my_map["CSE"] << endl;
   cout <<  my_map["Bangladesh"] << endl;
Output :
2009
2016
1971
এখন আমি যদি লুপ চালিয়ে map এর ডাটা কে প্রিন্ট করতে চাই তবে আমরা যে টাইপের map সেই টাইপের একটা iterator বানাতে হবে । এখন প্রশ্ন হতে পারে iterator আবার কি জিনিস ? iterator আমাদের map এর ভালুর এড্রেস রাখতে পারে এবং আমরা সেই এড্রেস ধরে map এর key, value দুইটাকেই প্রিন্ট করেত পারি ।

আমাদের map এর নাম my_list এখন আমি যদি এই টাইপের iterator বানাতে চাই তবে লিখতে হবে

1
map <string, int> :: iterator it_name;

এই iterator কে ব্যাবহার করে আমরা লুপের মাধ্যমে ম্যাপের ডাটা কে অ্যাক্সেস করতে পারব ।

1
2
3
    for(it_name = my_map.begin(); it_name != my_map.end(); ++it_name) {
         cout << it_name->first << " = " << it_name->second << endl;
    }
Output :
BRUR = 2009
Bangladesh = 1971
CSE = 2016

map এর ক্ষেত্রে একটা বিষয় মাথায় রাখতে হবে সেটা হল map ডিফল্ট ভাবে তার key বা index অনুসারে ডাটা কে সর্ট [ ছোট থেকে বড় ] করে রাখে । এই জন্য আমরা Bangladesh কে সব শেষে ইনপুট নেয়ার পরও সেটা শেষে না এসে ২য় নাম্বারে এসেছে :)

সবগুলো কে একসাথে করলে কোড টি দেখতে এই রকম হবে ।
কোড :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>
#include <map> // include for map 

using namespace std;

int main()
{
    // Differetn type of map declare
    map <int, int> ii_map;
    map <string, string> ss_map;
    map <int, string> is_map;
    map <string, double > sd_map;

    map <string, int> my_map; // Declare map variable

    // insert value into map
    my_map["BRUR"] = 2009;
    my_map["CSE"] = 2016;
    my_map["Bangladesh"] = 1971;

    // print
    cout << my_map["BRUR"] << endl;
    cout << my_map["CSE"] << endl;
    cout <<  my_map["Bangladesh"] << endl;

    // print using iterator
    map <string, int> :: iterator it_name;

    for(it_name = my_map.begin(); it_name != my_map.end(); ++it_name) {
         cout << it_name->first << " = " << it_name->second << endl;
    }

    return 0;
}

পুনশ্চ : map এর অনেকগুলো built-in ফাংশন আছে সেগুলো পাওয়া যাবে ম্যাপ ফাংশন লিস্ট উইথ কোড

হ্যাপি সি প্লাস-প্লাসইং :)


Comments

Popular posts from this blog

[Python] *args vs **Kwargs

পাইথনে ফাংশন আর্গুমেন্ট *args ও **kwargs আমরা মাঝে মাঝেই পাইথনের ফাংশনের প্যারামিটার হিসাবে *args, ** kwargs কে দেখতে পাই । তো এগুলো আসলে কি ? এবং এগুলো কিভাবে কাজ করে ? এই দুইটা বুঝতে হলে প্রথমে আমাদের আর্গুমেন্ট কি সেটা বুঝতে হবে । আর্গুমেন্ট কোন ফাংশন কল করার সময় আমার ফাংশনে যে ভেলু pass করি করি সেটা কে বলা হয় আর্গুমেন্ট । পাইথনে দুই ধরনের আর্গুমেন্ট আছে, Keyword Argument. Positional Argument. Keyword Argument যে সকল আর্গুমেন্টের সাথে তার আইডেন্টিফায়ার থাকে সেসব আর্গুমেন্ট কে keyword argument বলে । উদাহরণ দিলে পরিষ্কার হয়ে যাবে। মনে করেন আমাদের এইরকম একটা ফাংশন আছে, উপরে আমরা ৪ নং লাইনে ফাংশন কল করার সময় যে দুইটা আর্গুমেন্ট pass করলাম সেটাকে বলা হয় keyword argument. এখানে name = 'Arif' এ name এবং age = 24 এর age আর্গুমেন্ট দুইটির আইডেন্টিফায়ার । কারণ name, age দিয়ে আমরা আলাদা ভাবে দুইটা আর্গুমেন্টকে আইডেন্টিফাই করতে পারছি । Positional Argument যে আর্গুমেন্ট গুলো keyword argument না সেগুলো কে positional argument বলে । এই ধরনের আর্গুমেন্টের কোন আইডেন্টি...