در این پست میخواهیم سراغ کلاس std::map، یکی دیگر از data container های رایج در زبان ++C برویم. فرض کنید میخواهیم برنامه دیکشنری انگلیسی به فارسی بنویسیم. دادههای ما در دیکشنری در یک سمت کلمات انگلیسی هستند و در سمت دیگر توضیحات فارسی این کلمات. کلمات انگلیسی بر خلاف توضیحات همیشه یکتا هستند. مثلاً شما میتوانید “Home” و “House” با معنی یکسان “Khaneh” داشته باشید. از طرفی دادهها باید به صورت صعودی (Ascending) مرتب شده باشند. مثلاً جایگاه Apple که با حرف A شروع شده باید قبل از Zebra باشد.
ویژگیهایی که نام بردیم در کلاس std::map وجود دارند. هنگامی که میخواهیم دادههایی متشکل از دو قسمت مرتبط به هم داشته باشیم سراغ map میرویم. به سمت اول دادهها (کلمات انگلیسی)، Key و به سمت دوم (توضیحات فارسی دیکشنری) Value گفته میشود. Key نوع سادهای چون string، int و … است، در حالیکه Value نوع پیچیدهتری مثل std::list هم میتواند باشد.
هنگام وارد کردن عضو جدید (insert) به map، این عضو در جایگاهی قرار میگیرد که ترتیب صعودی Key ها حفظ شود. ویژگیای که گرچه سرعت ما را میگیرد اما در جایی مثل برنامهی دیکشنری به کارمان میآید. اگر این مرتب بودن برای ما اهمیت نداشت، بهتر بود سراغ کلاس مشابه و سریعتر std::unordered_map میرفتیم.
حالا بریم سراغ پیاده کردن این مثال و دیدن بعضی از ویژگیهاش در عمل:
#include <iostream> #include <map> using namespace std; int main() { map<string, string> digilogist_dictionary {}; digilogist_dictionary.insert(pair<string, string>("Banana", "Moz")); digilogist_dictionary.insert(make_pair("Apple", "Sib")); digilogist_dictionary.insert(make_pair("Strawberry", "Khiar sabz")); digilogist_dictionary["Strawberry"] = "Toot franagi"; digilogist_dictionary["Orange"] = "Porteqal"; cout << "Our dictionary contains " << digilogist_dictionary.size() << " words: \n"; digilogist_dictionary.insert(make_pair("Home", "Khaneh")); digilogist_dictionary.erase("Home"); //digilogist_dictionary.clear(); for(auto entry: digilogist_dictionary) { cout << entry.first << ": " << entry.second << endl; } return 0; }
قدم اوّل در استفاده از این کلاس include کردن هدر map است. اگر قرار بود از کلاس std::unordered_map استفاده کنیم این خط به شکل زیر تغییر میکرد:
#include <unordered_map>
موقع تعریف شی از این کلاس باید مشخص کنیم که Key و Value از چه نوعی هستند. در اینجا ما هر دو رو از نوع string انتخاب کردیم. برای وارد کردن هر عضو باید متغیری از جنس کلاس std::pair به تابع insert بدهیم. در خط 10 ما نحوهی تعریف یک شی از این کلاس را میبینیم. اما راه راحتتر این است که از تابع std::make_pair استفاده کنیم که خودش نوع ورودیها را تشخیص میدهد و pair متناسب با آنها را برای ما برمیگرداند.
در خط 13 ما به عمد معنی کلمهی “strawberry” را اشتباه وارد کردیم و التبه در خط بعدش آن را اصلاح کردیم. مشاهده میکنید که به چه راحتی میتوان همانند یک آرایه از طریق Key به مقدار Value دست پیدا کرد.
اگر هم خواستیم عضوی را پاک کنیم از تابع erase میتوانیم استفاده کنیم. اگر هم هوس پاک کردن کل اعضا را داشتیم که با clear کلک همه را میکنیم!