نقشه ها (Maps)
«نقشه در C++» داده ها را به صورت «کلید/مقدار» نگه می دارد. هر کلید یکتاست. همچنین عناصر بر اساس کلید به صورت صعودی مرتب می شوند.
نقشه در C++ چیست؟
«نقشه (Map)» یعنی دیکشنری ساده. کلید مانند نام دانش آموز است. مقدار مثل سن اوست. بنابراین با کلید به مقدار می رسی، نه با ایندکس.
#include <map>
ساخت نقشه
نوع کلید و مقدار را مشخص کن. سپس نام نقشه را بده.
std::map<std::string, int> people;
می توانی هنگام تعریف، نقشه را مقداردهی کنی.
std::map<std::string, int> people = { {"John", 32}, {"Adele", 45}, {"Bo", 29} };
دسترسی با کلید
با براکت مربع به مقدار می رسی. ایندکس کار نمی کند.
std::map<std::string, int> people = { {"John", 32}, {"Adele", 45}, {"Bo", 29} };
std::cout << "John is: " << people["John"] << "\n";
std::cout << "Adele is: " << people["Adele"] << "\n";
تابع .at() امن تر است. نبود کلید را خطا می دهد.
std::map<std::string, int> people = { {"John", 32}, {"Adele", 45}, {"Bo", 29} };
std::cout << "Adele is: " << people.at("Adele") << "\n";
std::cout << "Bo is: " << people.at("Bo") << "\n";
هشدار: دسترسی به کلید ناموجود با .at() استثنا می دهد.
std::map<std::string, int> people = { {"John", 32}, {"Adele", 45}, {"Bo", 29} };
std::cout << people.at("Jenny");
تغییر مقدار
می توانی مقدارِ مربوط به یک کلید را عوض کنی.
std::map<std::string, int> people = { {"John", 32}, {"Adele", 45}, {"Bo", 29} };
people["John"] = 50;
std::cout << "John is: " << people["John"];
استفاده از .at() برای تغییر، ایمن تر است.
std::map<std::string, int> people = { {"John", 32}, {"Adele", 45}, {"Bo", 29} };
people.at("John") = 50;
std::cout << "John is: " << people.at("John");
افزودن عناصر
با براکت یا با .insert() می توانی اضافه کنی.
std::map<std::string, int> people = { {"John", 32}, {"Adele", 45}, {"Bo", 29} };
people["Jenny"] = 22;
people["Liam"] = 24;
people["Kasper"] = 20;
people["Anja"] = 30;
std::map<std::string, int> people = { {"John", 32}, {"Adele", 45}, {"Bo", 29} };
people.insert({"Jenny", 22});
people.insert({"Liam", 24});
people.insert({"Kasper", 20});
people.insert({"Anja", 30});
کلیدهای تکراری ممنوع
نقشه دو عنصر با یک کلید نگه نمی دارد. اولی باقی می ماند.
std::map<std::string, int> people = { {"John", 32}, {"Adele", 45}, {"Bo", 29} };
people.insert({"Jenny", 22});
people.insert({"Jenny", 30});
حذف، اندازه، خالی بودن
برای حذف خاص از .erase(کلید) استفاده کن.
std::map<std::string, int> people = { {"John", 32}, {"Adele", 45}, {"Bo", 29} };
people.erase("John");
برای حذف همه از .clear() کمک بگیر.
std::map<std::string, int> people = { {"John", 32}, {"Adele", 45}, {"Bo", 29} };
people.clear();
تعداد عناصر با .size() مشخص می شود.
std::map<std::string, int> people = { {"John", 32}, {"Adele", 45}, {"Bo", 29} };
std::cout << people.size();
std::map<std::string, int> a;
std::cout << a.empty();
std::map<std::string, int> b = { {"John", 32}, {"Adele", 45}, {"Bo", 29} };
std::cout << b.empty();
وجود یک کلید را با .count(کلید) بررسی کن.
std::map<std::string, int> people = { {"John", 32}, {"Adele", 45}, {"Bo", 29} };
std::cout << people.count("John");
حلقه روی نقشه
با for-each و auto پیمایش کن. از first و second استفاده کن.
std::map<std::string, int> people = { {"John", 32}, {"Adele", 45}, {"Bo", 29} };
for (auto person : people) {
  std::cout << person.first << " is: " << person.second << "\n";
}
برای ترتیب نزولی، از greater<نوع کلید> استفاده کن.
std::map<std::string, int, std::greater<std::string>> people = { {"John", 32}, {"Adele", 45}, {"Bo", 29} };
for (auto person : people) {
  std::cout << person.first << " is: " << person.second << "\n";
}
تمرین سه مرحله ای
- یک «نقشه در C++» از نام و سن بساز.
- دو نفر اضافه کن و یکی را تغییر بده.
- وجود یک نام را با count بررسی کن.
نکته: اگر عناصر یکتا بدون مقدار می خواهی، به مجموعه ها برو. برای پیمایش حرفه ای، فصل اشاره گرهای پیمایشگر را ببین. همچنین این صفحه درباره نقشه در C++ مرجع خوبی است.
جمع بندی سریع
- کلید یکتا است؛ مقدار می تواند تکراری باشد.
- ترتیب براساس کلید و صعودی است.
- دسترسی با کلید انجام می شود، نه ایندکس.
- at امن تر از براکت است.
