أمثلة شاملة حول التعامل مع الكلاس unordered_map
في كل مثال موضوع قمنا باستخدام دوال جديدة حتى تعرف كيف تستخدم جميع الدوال التي ذكرناها في الجدول.
في المثال التالي قمنا بتعريف كائن من unordered_map
مع تحديد أن عناصره تتكون من مفاتيح نوعها string
قيم و نوعها string
أيضاً.
بعدها قمنا بإضافة بعض العناصر فيه, كل عنصر عبارة منهم عبارة عن كود الإتصال الخاص بالبلد و إسم البلد.
بعدها قمنا بطباعة عدد العناصر التي قمنا بإضافتها.
في الأخير قمنا بعرض جميع مفاتيح و قيم العناصر الموجودة فيه بواسطة حلقة.
ملاحظة: قمنا باستخدام الدالة emplace()
لإضافة العناصر, الدالة size()
لمعرفة عدد العناصر التي تم إضافتها. عند عرض جميع قيم عناصر الكائن, قمنا باستخدام الدالة begin()
للحصول على مؤشر للعنصر الأول لأننا سنبدأ من عنده و الدالة end()
للحصول على مؤشر للعنصر الأخير لأننا سنتوقف عنده.
المثال الأول
main.cpp
#include <iostream>
#include <unordered_map>
using namespace std;
int main()
{
// string و قيم نوعها string يمكنه أن يحتوي على مفاتيح نوعها unordered_map هنا قمنا بتعريف كائن من الكلاس
unordered_map<string, string> um;
// كل عنصر يحتوي على كود البلد كمفتاح و إسمه كقيمة ,um هنا قمنا بإضافة 12 عنصر في الكائن
um.emplace("+961", "Lebanon");
um.emplace("+962", "Jordan");
um.emplace("+963", "Syria");
um.emplace("+964", "Iraq");
um.emplace("+965", "Kuwait");
um.emplace("+966", "KSA");
um.emplace("+967", "Yaman");
um.emplace("+968", "Oman");
um.emplace("+970", "Palestine");
um.emplace("+212", "Morocco");
um.emplace("+281", "Libya");
um.emplace("+20", "Egypt");
// size() باستخدام الدالة um هنا قمنا بطباعة عدد عناصر الكائن
cout << "um size = " << um.size() << "\n\n";
cout << "um keys and values\n";
cout << "---------------------\n";
// إبتداءاً من أول عنصر وصولاً لآخر عنصر فيه um هنا قمنا بإنشاء حلقة تقوم في كل دورة بطباعة قيم عنصر جديد من العناصر الموجودة في الكائن
for (auto it = um.begin(); it != um.end(); ++it)
{
// تمثل قيمة العمود الأول في العنصر و التي تعتبر المفتاح الخاص به first الخاصية
// تمثل قيمة العمود الثاني في العنصر و التي تمثل قيمته second و الخاصية
cout << it->first << "\t | " << it->second << "\n";
}
return 0;
}
سنحصل على النتيجة التالية عند التشغيل.
um size = 12
um keys and values
---------------------
+20 | Egypt
+281 | Libya
+212 | Morocco
+967 | Yaman
+970 | Palestine
+962 | Jordan
+968 | Oman
+961 | Lebanon
+963 | Syria
+966 | KSA
+965 | Kuwait
+964 | Iraq
في المثال التالي قمنا بتعريف كائن من unordered_map
مع تحديد أن عناصره تتكون من مفاتيح نوعها int
قيم و نوعها string
.
بعدها قمنا بعرض القيم الموجودة فيه بواسطة حلقة.
المثال الثاني
main.cpp
#include <iostream>
#include <unordered_map>
using namespace std;
int main()
{
// string و قيم نوعها int يمكنه أن يحتوي على مفاتيح نوعها unordered_map هنا قمنا بتعريف كائن من الكلاس
unordered_map<int, string> um = {
{1, "One"},
{2, "Two"},
{3, "Three"},
{4, "Four"},
{5, "Five"},
};
// إبتداءاً من أول عنصر وصولاً لآخر عنصر فيه um هنا قمنا بإنشاء حلقة تقوم في كل دورة بطباعة قيم عنصر جديد من العناصر الموجودة في الكائن
for (auto it = um.begin(); it != um.end(); ++it)
{
// تمثل قيمة العمود الأول في العنصر و التي تعتبر المفتاح الخاص به first الخاصية
// تمثل قيمة العمود الثاني في العنصر و التي تمثل قيمته second و الخاصية
cout << it->first << " - " << it->second << "\n";
}
return 0;
}
سنحصل على النتيجة التالية عند التشغيل.
5 - Five
4 - Four
3 - Three
2 - Two
1 - One
في المثال التالي قمنا بتعريف كائن من unordered_map
مع تحديد أن عناصره تتكون من مفاتيح نوعها int
قيم و نوعها string
.
بعدها قمنا بالبحث عن عنصر يملك مفتاح محدد لمعرفة ما إن كان يوجد عنصر يملك هذا المفتاح أم لا مع الإشارة إلى أنه في حال وجود عنصر يملك هذا المفتاح سيتم طباعة قيمته أيضاً.
ملاحظة: قمنا باستخدام الدالة count()
للبحث عن عنصر يملك مفتاح محدد في الكائن و قمنا باستخدام الدالة at()
لطباعة قيمة العنصر الذي يملك مفتاح محدد.
المثال الثالث
main.cpp
#include <iostream>
#include <unordered_map>
using namespace std;
int main()
{
// string و قيم نوعها int يمكنه أن يحتوي على مفاتيح نوعها unordered_map هنا قمنا بتعريف كائن من الكلاس
unordered_map<int, string> um = {
{1, "One"},
{2, "Two"},
{3, "Three"},
{4, "Four"},
{5, "Five"},
};
// يوجد فيه عنصر يملك مفتاح يساوي 4 أم لا um هنا قمنا بطباعة ما إن كان الكائن
if (um.count(4))
{
// إن كان فيه سيتم تنفيذ أمر الطباعة التالي
cout << "Element with key '4' is exist and it's value = " << um.at(4);
}
else
{
// إن لم يكن فيه سيتم تنفيذ أمر الطباعة التالي
cout << "There is no element with key = 4";
}
return 0;
}
سنحصل على النتيجة التالية عند التشغيل.
Element with key '4' is exist and it's value = Four
في المثال التالي قمنا بتعريف كائن من unordered_map
مع تحديد أن عناصره تتكون من مفاتيح نوعها int
قيم و نوعها string
.
بعدها قمنا بحذف عنصر منه بالإعتماد على قيمة مفتاحه و من ثم طباعة قيم جميع العناصر المتبقية بواسطة حلقة.
ملاحظة: قمنا باستخدام الدالة erase()
لحذف العنصر.
المثال الرابع
main.cpp
#include <iostream>
#include <unordered_map>
using namespace std;
int main()
{
// string و قيم نوعها int يمكنه أن يحتوي على مفاتيح نوعها unordered_map هنا قمنا بتعريف كائن من الكلاس
unordered_map<int, string> um = {
{1, "One"},
{2, "Two"},
{3, "Three"},
{4, "Four"},
{5, "Five"}
};
// um هنا قمنا بحذف العنصر الذي يملك مفتاح يساوي 3 في الكائن
um.erase(3);
// إبتداءاً من أول عنصر وصولاً لآخر عنصر فيه um هنا قمنا بإنشاء حلقة تقوم في كل دورة بطباعة قيم عنصر جديد من العناصر الموجودة في الكائن
for (auto it = um.begin(); it != um.end(); ++it)
{
// تمثل قيمة العمود الأول في العنصر و التي تعتبر المفتاح الخاص به first الخاصية
// تمثل قيمة العمود الثاني في العنصر و التي تمثل قيمته second و الخاصية
cout << it->first << " - " << it->second << "\n";
}
return 0;
}
سنحصل على النتيجة التالية عند التشغيل.
Element with key '4' is removed from um
um keys and values:
5 - Five
3 - Three
2 - Two
1 - One
في المثال التالي قمنا بتعريف كائن من unordered_map
مع تحديد أن عناصره تتكون من مفاتيح نوعها int
قيم و نوعها string
.
بعدها قمنا بالبحث عن عنصر يملك مفتاح محدد فيه و في حال وجوده سيتم حذف العنصر من الكائن.
في الأخير قمنا بطباعة قيم جميع العناصر المتبقية بواسطة حلقة.
ملاحظة: قمنا باستخدام الدالة find()
للبحث عن العنصر الذي يملك المفتاح في الكائن و الدالة erase()
لحذف العنصر من الكائن.
المثال الخامس
main.cpp
#include <iostream>
#include <unordered_map>
using namespace std;
int main()
{
// string و قيم نوعها int يمكنه أن يحتوي على مفاتيح نوعها unordered_map هنا قمنا بتعريف كائن من الكلاس
unordered_map<int, string> um = {
{1, "One"},
{2, "Two"},
{3, "Three"},
{4, "Four"},
{5, "Five"}
};
// لتخزين مكان العنصر الذي نجد القيمة التي نبحث عنها فيه unordered_map<int, string>::iterator منا قمنا بتعريف كائن من
unordered_map<int, string>::iterator it;
// it عن عنصر يملك مفتاح يساوي 4, و بالتالي في حال وجود عنصر يملك هذا المفتاح سيتم تخزين عنوانه في الكائن um هنا قمنا بالبحث في الكائن
// فيه للإشارة إلى أنه لم يتم إيجاد أي عنصر يملك هذا المفتاح um.end() في حال عدم وجود عنصر يملك مفتاح يساوي 4 سيتم تخزين القيمة التي ترجعها
it = um.find(4);
// فهذا يعني أنه تم إيجاد العنصر و بالتالي سيتم تنفيذ الكود الموضوع بالداخل um.end() لا تساوي القيمة التي ترجعها الدالة it في حال كانت قيمة
if (it != um.end())
{
// و من ثم قمنا بحذفه um هنا قمنا بطباعة مفتاح العنصر الذي تم إيجاده في الكائن
cout << "Element with key '"<< it->first << "' is removed from um\n\n";
um.erase(it);
}
cout << "um keys and values:\n";
// إبتداءاً من أول عنصر وصولاً لآخر عنصر فيه um هنا قمنا بإنشاء حلقة تقوم في كل دورة بطباعة قيم عنصر جديد من العناصر الموجودة في الكائن
for (auto it = um.begin(); it != um.end(); ++it)
{
// تمثل قيمة العمود الأول في العنصر و التي تعتبر المفتاح الخاص به first الخاصية
// تمثل قيمة العمود الثاني في العنصر و التي تمثل قيمته second و الخاصية
cout << it->first << " - " << it->second << "\n";
}
return 0;
}
سنحصل على النتيجة التالية عند التشغيل.
Element with key '4' is removed from um
um keys and values:
1 - One
2 - Two
3 - Three
5 - Five
في المثال التالي قمنا بتعريف كائنين من unordered_map
مع تحديد أن عناصرهما تتكون من مفاتيح نوعها int
قيم و نوعها string
.
بعدها قمنا بتبديل عناصرهما و من ثم طباعة قيم عناصرهما بواسطة حلقة للتأكد من أن التبديل قد تم بنجاح.
ملاحظة: قمنا باستخدام الدالة swap()
لتبديل عناصرهما.
المثال السادس
main.cpp
#include <iostream>
#include <unordered_map>
using namespace std;
int main()
{
// بالإضافة إلى أننا قمنا بإضافة عدة قيم فيه string و قيم نوعها int يمكنه أن يحتوي على مفاتيح نوعها unordered_map هنا قمنا بتعريف كائن من الكلاس
unordered_map<int, string> um1 = {
{1, "One"},
{2, "Two"},
{3, "Three"},
{4, "Four"}
};
// بالإضافة إلى أننا قمنا بإضافة عدة قيم فيه string و قيم نوعها int يمكنه أن يحتوي على مفاتيح نوعها unordered_map هنا قمنا بتعريف كائن آخر من الكلاس
unordered_map<int, string> um2 = {
{5, "Five"},
{6, "Six"},
{7, "Seven"},
{8, "Eight"}
};
// um2 مع قيم الكائن um1 هنا قمنا بتبديل قيم الكائن
um1.swap(um2);
cout << "um1 keys and values:\n";
// إبتداءاً من أول عنصر وصولاً لآخر عنصر فيه um1 هنا قمنا بإنشاء حلقة تقوم في كل دورة بطباعة قيم عنصر جديد من العناصر الموجودة في الكائن
for (auto it = um1.begin(); it != um1.end(); ++it)
{
// تمثل قيمة العمود الأول في العنصر و التي تعتبر المفتاح الخاص به first الخاصية
// تمثل قيمة العمود الثاني في العنصر و التي تمثل قيمته second و الخاصية
cout << it->first << " - " << it->second << "\n";
}
cout << "\num2 keys and values:\n";
// إبتداءاً من أول عنصر وصولاً لآخر عنصر فيه um2 هنا قمنا بإنشاء حلقة تقوم في كل دورة بطباعة قيم عنصر جديد من العناصر الموجودة في الكائن
for (auto it = um2.begin(); it != um2.end(); ++it)
{
// تمثل قيمة العمود الأول في العنصر و التي تعتبر المفتاح الخاص به first الخاصية
// تمثل قيمة العمود الثاني في العنصر و التي تمثل قيمته second و الخاصية
cout << it->first << " - " << it->second << "\n";
}
return 0;
}
سنحصل على النتيجة التالية عند التشغيل.
um1 keys and values:
8 - Eight
7 - Seven
6 - Six
5 - Five
um2 keys and values:
4 - Four
3 - Three
2 - Two
1 - One
في المثال التالي قمنا بتعريف كائن من unordered_map
مع تحديد أن عناصره تتكون من مفاتيح نوعها string
قيم و نوعها string
أيضاً.
بعدها قمنا بإضافة بعض العناصر فيه, كل عنصر عبارة منهم عبارة عن كود الإتصال الخاص بالبلد و إسم البلد.
في الأخير قمنا بعرض مفاتيح و قيم العناصر الموجودة في كل Bucket فيه بواسطة حلقتين متداخلتين.
ملاحظة: قمنا باستخدام الدالة bucket_count()
لمعرفة كم Bucket تم إنشاؤها بشكل تلقائي و الدالة bucket_size()
لمعرفة عدد العناصر الموجودة في كل Bucket.
المثال السابع
main.cpp
#include <iostream>
#include <unordered_map>
using namespace std;
int main()
{
// string و قيم نوعها string يمكنه أن يحتوي على مفاتيح نوعها unordered_map هنا قمنا بتعريف كائن من الكلاس
unordered_map<string, string> um;
// كل عنصر يحتوي على كود البلد كمفتاح و إسمه كقيمة ,um هنا قمنا بإضافة 12 عنصر في الكائن
um.emplace("+961", "Lebanon");
um.emplace("+962", "Jordan");
um.emplace("+963", "Syria");
um.emplace("+964", "Iraq");
um.emplace("+965", "Kuwait");
um.emplace("+966", "KSA");
um.emplace("+967", "Yaman");
um.emplace("+968", "Oman");
um.emplace("+970", "Palestine");
um.emplace("+212", "Morocco");
um.emplace("+281", "Libya");
um.emplace("+20", "Egypt");
// totalBuckets التي تم إنشاؤها في المتغير Buckets هنا قمنا بتخزين عدد جميع الـ
int totalBuckets = um.bucket_count();
// um الموجودين في الكائن Buckets هنا قمنا بإنشاء حلقة تمر على جميع الـ
for(int i=0; i<totalBuckets; i++)
{
// Bucket في كل دورة سيتم طباعة رقم الـ
cout << "bucket[" << i << "] elements:";
// و من ثم طباعة مفتاح و قيمة كل عصنر موجود فيها الحلقة التالية
for(auto it=um.begin(i); it!=um.end(i); ++it)
{
cout << " [" << it->first << " : " << it->second << "]";
}
cout << endl;
}
}
سنحصل على النتيجة التالية عند التشغيل.
bucket[0] elements:
bucket[1] elements:
bucket[2] elements:
bucket[3] elements:
bucket[4] elements: [+963 : Syria]
bucket[5] elements: [+967 : Yaman]
bucket[6] elements: [+966 : KSA] [+965 : Kuwait]
bucket[7] elements: [+968 : Oman] [+961 : Lebanon]
bucket[8] elements:
bucket[9] elements:
bucket[10] elements: [+281 : Libya] [+212 : Morocco]
bucket[11] elements: [+970 : Palestine] [+962 : Jordan]
bucket[12] elements:
bucket[13] elements: [+20 : Egypt]
bucket[14] elements:
bucket[15] elements: [+964 : Iraq]
bucket[16] elements:
في المثال التالي قمنا بتعريف كائن من unordered_map
مخصص لتخزين عناصر تتكون من مفاتيح نوعها string
و قيم نوعها string
أيضاً مع إضافة عدة قيم فيه عند تعريفه.
بعدها قمنا بعرض عدد العناصر الموجودة في كل Bucket فيه بواسطة حلقتين متداخلتين.
ملاحظة: قمنا باستخدام الدالة bucket_count()
لمعرفة كم Bucket تم إنشاؤها بشكل تلقائي.
المثال الثامن
main.cpp
#include <iostream>
#include <unordered_map>
using namespace std;
int main()
{
// بالإضافة إلى أننا قمنا بإضافة عدة قيم فيه string يمكنه أن يحتوي على عناصر نوعها unordered_map هنا قمنا بتعريف كائن من الكلاس
unordered_map<string, string> um = {
{"+961", "Lebanon"},
{"+962", "Jordan"},
{"+963", "Syria"},
{"+964", "Iraq"},
{"+965", "Kuwait"},
{"+966", "KSA"},
{"+967", "Yaman"},
{"+968", "Oman"},
{"+970", "Palestine"},
{"+212", "Morocco"},
{"+281", "Libya"},
{"+20", "Egypt"}
};
// totalBuckets التي تم إنشاؤها في المتغير Buckets هنا قمنا بتخزين عدد جميع الـ
int totalBuckets = um.bucket_count();
// um الموجودين في الكائن Buckets هنا قمنا بإنشاء حلقة تمر على جميع الـ
for(int i=0; i<totalBuckets; i++)
{
// و عدد العناصر الموجودة فيها Bucket في كل دورة سيتم طباعة رقم الـ
cout << "bucket[" << i << "] total elements = " << um.bucket_size(i);
cout << endl;
}
}
سنحصل على النتيجة التالية عند التشغيل.
bucket[0] total elements = 1
bucket[1] total elements = 0
bucket[2] total elements = 1
bucket[3] total elements = 2
bucket[4] total elements = 0
bucket[5] total elements = 0
bucket[6] total elements = 3
bucket[7] total elements = 1
bucket[8] total elements = 0
bucket[9] total elements = 1
bucket[10] total elements = 1
bucket[11] total elements = 0
bucket[12] total elements = 2
في المثال التالي قمنا بتعريف كائن من unordered_map
مخصص لتخزين مفاتيح نوعها string
و قيم نوعها string
أيضاً مع تحديد الطريقة التي سيتم على أساسها توزيع العناصر في Buckets و إضافة عدة عناصر فيه عند تعريفه.
لتحديد الطريقة التي سيتم على أساسها توزيع العناصر في Buckets قمنا بإنشاء كلاس إسمه Hash
و إعادة تعريف العامل ()
حتى يقارن مفتاح أي عنصر نريد إضافته نسبةً لعدد الأحرف الموجودة فيه, عندها يتم وضع العناصر التي تملك مفتاح يتألف من حرف واحد في Bucket, و العناصر التي تملك مفتاح يتألف من حرفين في Bucket, و العناصر التي تملك مفتاح يتألف من ثلاثة أحرف في Bucket و هكذا..
في النهاية قمنا بعرض المفاتيح الموجودة في كل Bucket فيه بواسطة حلقتين متداخلتين.
المثال التاسع
main.cpp
#include <iostream>
#include <unordered_map>
using namespace std;
// unordered_map سنستخدمه لاحقاً لتحديد كيف ستترتب العناصر في الحاوية التي ننشئها من الكلاس Hash هنا قمنا بتعريف كلاس إسمه
class Hash
{
public:
// Bucket حتى يقرر في أي unordered_map هنا قمنا بتعريف العامل الذي سيستخدمه الكائن الذي ننشئه من الكلاس
// key سيتم وضع العنصر الذي نضيفه فيه مع الإشارة إلى أن المفتاح الذي يملكه العنصر سيتم تمريره مكان الباراميتر
size_t operator() (const string &key) const
{
// سيتم إضافة العنصر Bucket في النهاية سيتم إرجاع عدد أحرف مفتاح العنصر لأنها التي ستحدد في أي
return key.length();
}
};
int main()
{
// مع تحديد أنه يعتمد string يمكنه أن يحتوي على عناصر مفاتيحها و قيمها نوعها unordered_map هنا قمنا بتعريف كائن من الكلاس
// من أجل تحديد الطريقة التي سيتم فيها ترتيب العناصر التي نضيفها فيه, بالإضافة إلى أننا قمنا بإضافة عدة قيم فيه Hash على الكلاس
unordered_map<string, string, Hash> um = {
{"HTML", "Hyper Text Markup Language"},
{"CSS", "Cascading Style Sheet"},
{"CS", "Computer Science"},
{"Algo", "Algorithms"},
{"OOP", "Object Oriented Programming"},
{"DB", "Database"},
{"SQL", "Structured Query Language"}
};
// totalBuckets التي تم إنشاؤها في المتغير Buckets هنا قمنا بتخزين عدد جميع الـ
int totalBuckets = um.bucket_count();
// um الموجودين في الكائن Buckets هنا قمنا بإنشاء حلقة تمر على جميع الـ
for(int i=0; i<totalBuckets; i++)
{
// Bucket في كل دورة سيتم طباعة رقم الـ
cout << "bucket[" << i << "] elements:";
// و من ثم طباعة مفاتيح العناصر الموجودة فيها بواسطة الحلقة التالية
for(auto it=um.begin(i); it!=um.end(i); ++it)
{
cout << " " << it->first;
}
cout << endl;
}
return 0;
}
سنحصل على النتيجة التالية عند التشغيل, و لاحظ كيف تم ترتيب العناصر على أساس عدد الأحرف التي يتألف منها كل عنصر.
bucket[0] elements:
bucket[1] elements:
bucket[2] elements: DB CS
bucket[3] elements: SQL OOP CSS
bucket[4] elements: Algo HTML
bucket[5] elements:
bucket[6] elements:
bucket[7] elements:
bucket[8] elements:
bucket[9] elements:
bucket[10] elements: