সেট

সেট বলতে আমরা এমন একটা কন্টেইনার বুঝি, যেখানে কোনো জিনিস একবারের বেশি থাকবে না। যেমন, {1,2,3} একটা সেট, কিন্তু {1,2,1} সেট না। তুমি একটা সেট বানানোর পর যদি তাতে ১০০ বারও ১ ইনপুট কর, এতে ১ থাকবে শুধুমাত্র একবারই।

সেটের আরও একটা সুবিধা হল, এটি ডাটাগুলোকে সর্টও করে রাখে! কথা না বাড়িয়ে একটি কোড লিখেই দেখে নেওয়া যাক সেট-এর কাজ কারবার!

#include <iostream>
#include <set>
using namespace std;
int main() {
    set < int > amarSet;
    int in;

    // icchamoto 10 ta element di
    for (int i=1; i<=10; i++) {
        cin >> in;
        amarSet.insert(in);
    }

    set < int > :: iterator it;

    // koita element ache dekha jak!
    cout << "There are " << amarSet.size() << " elements in the set!\n";

    // ebar element gula print kore dekhi!
    for(it = amarSet.begin(); it != amarSet.end(); it++) {
        cout << *it << endl;
    }

    return 0;
}

এটি রান করে যদি 1 1 2 2 3 3 4 4 5 5 ইনপুট দেওয়া হয়্‌, তাহলে দেখবা আউটপুট আসে নিচের মতঃ

Snap 2015-07-21 at 12.14.24

অর্থাৎ, যতবারই দাও না কেন, সেটে সেটা থাকছে একবারই! আর বুঝতেই পারছো সেটে ইলিমেন্ট প্রবেশ করাতে হয় insert() দিয়ে আর সাইজ রিটার্ন করে size() দিয়ে! এছাড়া পুরো সেটটি খালি করে দেওয়া যায় clear() দিয়ে!

#include <iostream>
#include <set>
using namespace std;
int main() {
    set < int > amarSet;
    int in;

    // icchamoto 10 ta element di
    for (int i=1; i<=10; i++) {
        cin >> in;
        amarSet.insert(in);
    }

    set < int > :: iterator it;

    // koita element ache dekha jak!
    cout << "There are " << amarSet.size() << " elements in the set!\n";

    // ebar element gula print kore dekhi!
    for(it = amarSet.begin(); it != amarSet.end(); it++) {
        cout << *it << endl;
    }
    amarSet.clear();
    if (amarSet.empty()) cout << "Oops! the set is empty!\n";
    return 0;
}

সেট কাজে লাগে সাধারণত সেই সব প্রবলেমে, যেখানে কোনো ইনপুট ডাটার মধ্যে কতটি ইউনিক ডাটা আছে সেটা বের করতে হয়। যেমন কোডশেফের এই প্রবলেমটা সলভ করে দেখতে পার!

তুমি চাইলে স্ট্রাকচারের সেটও বানাতে পার। তবে এক্ষেত্রে তোমাকে অবশ্যই অপারেটর ওভারলোড করে বলে দিতে হবে এক স্ট্রাকচার আরেক স্ট্রাকচার থেকে ছোট না বড় – সেটা তুমি কীভাবে ডিফাইন করবে।

 ম্যাপ

ধর, তোমরা ১০০ জন বন্ধু পিকনিকে যাবা। এখন ১০০ জনের প্রত্যেকে একেকটা জায়গার নাম বলবে। যে জায়গার নাম সবচেয়ে বেশি বলা হবে, সবাই মিলে সে জায়গায় পিকনিকে যাবা। এখন তোমাকে এই সমস্যার জন্য একটা কোড লিখতে বলা হলে কী করবা?

এই সমস্যা খুব সহজেই সমাধান করে ফেলা যায় ম্যাপ ইউজ করে। ম্যাপের মূল ব্যাপারটাকে এভাবে চিন্তা করা যায় যে, এখানে একটা অ্যারে নেওয়া হবে। তবে অ্যারের ইনডেক্স হবে তোমার ইচ্ছে মত। অর্থাৎ তুমি চাইলে অ্যারের ইনডেক্স হিসেবে ব্যবহার করতে পার “Chittagong”!

কথা না বাড়িয়ে একটা কোড লিখেই ব্যাপারটা দেখা যাক।

#include <iostream>
#include <map>
using namespace std;
int main() {
    map< string, int  > amarMap;
    string str;

    for (int i=0;i<10;i++){
        cin >> str;
        amarMap[str] ++;
    }

    cout << "Chittagong vote diche " << amarMap["Chittagong"] << " jon\n";
    cout << "Dhaka vote diche " << amarMap["Dhaka"] << " jon\n";
    cout << "Rangpur vote diche " << amarMap["Rangpur"] << " jon\n";
    cout << "Sylhet vote diche " << amarMap["Sylhet"] << " jon\n";
    cout << "Khulna vote diche " << amarMap["Khulna"] << " jon\n";
    cout << "Barisal vote diche " << amarMap["Barisal"] << " jon\n";
    cout << "Rajshahi vote diche " << amarMap["Rajshahi"] << " jon\n";
    return 0;
}

কোডটি রান করে Chittagong, Dhaka, Khulna, Rajshahi, Rangpur, Sylhet, Barisal কয়েকবার করে ইনপুট দিয়ে দেখ!

ম্যাপে কাজ করেঃ

  • amarMap.erase(“Dhaka”) দিয়ে এই ইলিমেন্ট ইরেজ করে দেওয়া যাবে
  • empty() দিয়ে বুলিয়ান ভ্যালু রিটার্ন হবে
  • size() দিয়ে কয়টি ইউনিক ইনডেক্স আছে সেটা রিটার্ন হবে
  • clear() দিয়ে পুরো ম্যাপ ক্লিয়ার হয়ে যাবে

আজ এ পর্যন্তই। আমরা আগামী পর্বে একটা অ্যালগরিদম নিয়ে জানবো, [স্পইলার অ্যালার্ট] যেটা আমাদেরকে অতিমাত্রায় অলস করে দিবে! 😉 ততদিন পর্যন্ত ভাল থাকবেন, সুস্থ থাকবেন!

Muntasir Wahed

Muntasir Wahed

System Administrator at স্বশিক্ষা.com
Jack of all trades, master of none.
Muntasir Wahed
Muntasir Wahed