আমরা জানি ম্যাপ ডিফল্ট ভাবে তার key অনুসারে অ্যাসেন্ডিং অর্ডারে সর্ট হয় । কিন্তু আমরা যদি key অনুসারে সর্ট না করে value অনুসারে সর্ট করতে চাই তখন এই কাজটা কি ভাবে করা যায় আজকে আমরা সেটা দেখব ।
সাধারণ ভাবে ম্যাপ কে তার ভেলু অনুসারে সর্ট করা যায় না । ম্যাপ কে তার value অনুসারে সর্ট করার জন্য প্রথমে ম্যাপ এর সবগুলো element [ key, value ] কে একটা vector এ কপি করে রাখতে হবে । এবং আমাদের কে সেই vector কে সর্ট করতে হবে ।
মনে করি আমাদের এই রকম একটা ম্যাপ আছে এবং তার মধ্যে এই ভেলুগুলো আছে ।
1 2 3 4 5 | map <string, int> mp; mp["ABC"] = 10; mp["DEF"] = 9; mp["GHI"] = 5; |
ম্যাপের এই ডাটা গুলো কে আমরা একটা vector এ কপি করে রাখব ।
1 2 3 4 5 6 | vector <pair< string, int>> v; for(auto it = mp.begin(); it != mp.end(); ++it) { v.push_back(*it); // or we can use // v.push_back(make_pair(it->first, it->second)); } |
আমাদের ম্যাপের যেহেতু key, value দুইটা ভালু থাকে তাই এই দুইটা কে রাখার জন্য vector এর pair ব্যবহার করেছি । এখন আমদের এই vector কে সর্ট করতে হবে তার pair এর ২য় element এর উপর ভিত্তি করে ।
আমরা যদি C++ এর sort() ফাংশন ব্যবহার করে vector কে সর্ট করি তবে এই ভাবে লিখি,
sort( v.begin(), v.end() )
আমরা কি ভাবে সর্ট করতে চাচ্ছি সেটা একটা compare ফাংশন লিখে আমাদের sort() ফাংশন কে বলে দিতে হবে যে আমরা এই ভাবে সর্ট করতে চাচ্ছি । তো compare ফাংশন টা লিখে ফেলি :)
1 2 3 | bool comp(const pair<string, int> &a, const pair <string, int> &b) { return a.second < b.second; } |
আমরা আমাদের comp ফাংশনে a, b নামে দুইটা ভালু পাঠায়া দিয়েছি । আমাদের vector টাইপ pair এর প্রথম টি হল ম্যাপের key এবং ২য় টি হল ম্যাপের value . আমরা যেহেতু ম্যাপ কে value অনুসারে সর্ট করতে চাই তাই আমরা শর্ত হিসাবে a.second < b.second দিয়েছি ।
এখন এই comp ফাংশন কে sort() ফাংশনের একটা প্যারামিটার হিসাবে পাঠাতে হবে এই ভাবে ,
sort(v.begin(), v.end(), comp)
এখন প্রিন্ট করা দেখার পালা ।
1 2 3 | for(int i = 0; i < v.size(); i++) { cout << v[i].first << " " << v[i].second << endl; } |
আউটপুট যদি এই রকম হয় তবে সব ঠিক আছে :)
GHI 5
DEF 9
ABC 10
সম্পূর্ণ কোড :
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 | #include <iostream> #include <map> #include <vector> #include <algorithm> using namespace std; bool comp(const pair<string, int> &a, const pair <string, int> &b) { return a.second < b.second; } int main() { map <string, int> mp; mp["ABC"] = 10; mp["DEF"] = 9; mp["GHI"] = 5; // copy the map data into vector. vector <pair< string, int>> v; for(auto it = mp.begin(); it != mp.end(); ++it) { v.push_back(*it); // or we can use //v.push_back(make_pair(it->first, it->second)); } // sort by 2nd element sort(v.begin(), v.end(), comp); for(int i = 0; i < v.size(); i++) { cout << v[i].first << " " << v[i].second << endl; } return 0; } |
আর একাটা বিষয় । ম্যাপ তো তার key এর উপর ভিত্তি করে ডাটা কে ছোট থেকে বড় আকারে সর্ট করে রাখে । কিন্তু আমাদের দরকার বড় থেকে ছোট আকারে সর্ট করে রাখবে । এই কাজ করার জন্য আমরা যখন ম্যাপ লিখব তখন এই ভাবে লিখতে হবে ।
map <int, string, greater<int> > mp;
কোড :
1 2 3 4 5 6 7 8 9 10 | map <int, int, greater<int> > mp2; mp2[5] = 20; mp2[10] = 30; mp2[3] = 15; cout << "Sort map Descending order: " << endl; for(auto it = mp2.begin(); it != mp2.end(); it++) { cout << it->first << " " << it->second << endl; } |
এইখানে আমরা ম্যাপ লিখার সময় greater<int> দিয়ে বলে দিচ্ছি আমাদের ম্যাপ টি বড় থেকে ছোট আকারে সর্ট হবে ।
হ্যাপি সি প্লাস প্লাসইং :D
Comments
Post a Comment