كيفية استخدام C ++ Unordered Map

How Use C Unordered Map



الخريطة ، المعروفة أيضًا باسم المصفوفة الترابطية ، هي قائمة بالعناصر ، حيث يكون كل عنصر عبارة عن زوج مفتاح / قيمة. لذلك ، كل مفتاح يتوافق مع قيمة. يمكن أن يكون للمفاتيح المختلفة نفس القيمة للعمل العادي. على سبيل المثال ، يمكن أن تكون المفاتيح قائمة بالفواكه والقيم المقابلة ، ألوان الثمار. في C ++ ، يتم تنفيذ الخريطة كهيكل بيانات مع وظائف الأعضاء والمشغلين. الخريطة المرتبة هي الخريطة التي تم ترتيب أزواج العناصر فيها بواسطة المفاتيح. الخريطة غير المرتبة هي الخريطة التي لا يوجد فيها ترتيب. تشرح هذه المقالة كيفية استخدام خريطة غير مرتبة C ++ ، مكتوبة كـ unordered_map. تحتاج إلى معرفة بمؤشرات C ++ لفهم هذه المقالة. unordered_map جزء من مكتبة C ++ القياسية.

فئة وكائنات

الفئة عبارة عن مجموعة من المتغيرات والوظائف التي تعمل معًا ، حيث لا تحتوي المتغيرات على قيم معينة. عندما يتم تعيين القيم للمتغيرات ، تصبح الفئة كائنًا. القيم المختلفة المعطاة لنفس الفئة تؤدي إلى كائنات مختلفة ؛ أي أن الكائنات المختلفة هي نفس الفئة بقيم مختلفة. يُقال إن إنشاء كائن من فئة ما يؤدي إلى إنشاء الكائن.







الاسم، unordered_map ، هي فئة. كائن تم إنشاؤه من فئة unordered_map له اسم مبرمج تم اختياره.



هناك حاجة إلى وظيفة تنتمي إلى فئة لإنشاء مثيل لكائن من الفئة. في C ++ ، هذه الوظيفة لها نفس اسم اسم الفئة. الكائنات التي تم إنشاؤها (تم إنشاء مثيل لها) من الفصل لها أسماء مختلفة تم إعطاؤها لها من قبل المبرمج.



إنشاء كائن من الفصل يعني بناء الكائن ؛ هذا يعني أيضًا إنشاء مثيل.





يبدأ برنامج C ++ الذي يستخدم فئة unordered_map بالأسطر التالية في أعلى الملف:

#يشمل
#يشمل
استخدام اسم للمحطة؛

السطر الأول للإدخال / الإخراج. السطر الثاني هو السماح للبرنامج باستخدام جميع ميزات فئة unordered_map. يسمح السطر الثالث للبرنامج باستخدام الأسماء في مساحة الاسم القياسية.



زيادة التحميل على وظيفة

عندما يكون لتوقيعين مختلفين أو أكثر نفس الاسم ، يُقال أن هذا الاسم محمّل بشكل زائد. عندما يتم استدعاء دالة واحدة ، رقم ونوع الوسيطات ، حدد الوظيفة التي يتم تنفيذها بالفعل.

إنشاءات / نسخ إنشاءات

بناء بسيط

يمكن إنشاء خريطة غير مرتبة وتعيين قيم على النحو التالي:

unordered_map<مقدار ثابت شار* ، مقدار ثابت شار*>Umap؛

Umap['موز'] = 'أصفر'؛
Umap['عنب'] = 'لون أخضر'؛
Umap['تين'] = 'نفسجي'؛

يبدأ الإعلان بتخصص القالب بأنواع أزواج المفتاح والقيمة. ويتبع ذلك الاسم الذي اختاره المبرمج للخريطة ؛ ثم فاصلة منقوطة. يوضح مقطع الكود الثاني كيفية تعيين قيم لمفاتيحها.
البناء بواسطة Initializer_list
ويمكن القيام بذلك على النحو التالي:

unordered_map<مقدار ثابت شار* ، مقدار ثابت شار*>Umap({{'موز'و 'أصفر'}و
{'عنب'و 'لون أخضر'}و {'تين'و 'نفسجي'}})؛

البناء عن طريق تعيين Initializer_list
مثال:

unordered_map<مقدار ثابت شار* ، مقدار ثابت شار*>Umap= {{'موز'و 'أصفر'}و
{'عنب'و 'لون أخضر'}و {'تين'و 'نفسجي'}}؛

البناء عن طريق نسخ خريطة أخرى غير مرتبة
مثال:

unordered_map<مقدار ثابت شار* ، مقدار ثابت شار*>umap1({{'موز'و 'أصفر'}و
{'عنب'و 'لون أخضر'}و {'تين'و 'نفسجي'}})؛
unordered_map<مقدار ثابت شار* ، مقدار ثابت شار*>umap2(umap1)؛

عنصر الزوج

يوضح الكود التالي كيفية إنشاء العنصر الزوجي والوصول إليه:

زوج<شارو مقدار ثابت شار*>العلاقات العامة= {'د'و 'يكون'}؛
كلفة<<العلاقات العامة.أول << 'ن'؛
كلفة<<العلاقات العامة.ثانيا << 'ن'؛

الخرج هو:

د
يكون

يتم حجز الكلمات الأولى والثانية للعنصرين في الزوج. لا يزال من الممكن تغيير القيم في الزوج باستخدام الأول والثاني.

يسمى الزوج ، value_type في موضوع الخريطة غير المرتبة.

الوصول إلى عنصر unordered_map

mapped_type & عامل التشغيل [] (key_type && k)
ترجع قيمة المفتاح المقابل. مثال:

unordered_map<مقدار ثابت شار* ، مقدار ثابت شار*>Umap؛

Umap['موز'] = 'أصفر'؛
Umap['عنب'] = 'لون أخضر'؛
Umap['تين'] = 'نفسجي'؛

مقدار ثابت شار *حق=Umap['عنب']؛

كلفة<<حق<<'ن'؛

الخرج: أخضر. يمكن تعيين القيم بنفس الطريقة - انظر أعلاه.

قدرة unordered_map

size_type size () لا يوجد استثناء ثابت
تُرجع عدد الأزواج في الخريطة.

unordered_map<مقدار ثابت شار* ، مقدار ثابت شار*>Umap؛

Umap['موز'] = 'أصفر'؛
Umap['عنب'] = 'لون أخضر'؛
Umap['تين'] = 'نفسجي'؛

كلفة<<Umap.بحجم() <<'ن'؛

الإخراج هو 3.

منطقي فارغ () const noexcept

ترجع 1 إلى الحقيقة إذا كانت الخريطة لا تحتوي على أزواج ، و 0 لإرجاعها للخطأ إذا كانت تحتوي على أزواج. مثال:

unordered_map<مقدار ثابت شار* ، مقدار ثابت شار*>Umap؛
كلفة<<Umap.فارغة() <<'ن'؛

الإخراج هو 1.

إرجاع التكرارات وفئة الخريطة غير المرتبة

المكرر هو مثل المؤشر ولكن لديه وظائف أكثر من المؤشر.

تبدأ () لا باستثناء

إرجاع مكرر يشير إلى الزوج الأول من كائن الخريطة ، كما هو الحال في مقطع التعليمات البرمجية التالي:

unordered_map<مقدار ثابت شار* ، مقدار ثابت شار*>Umap؛

Umap['موز'] = 'أصفر'؛Umap['عنب'] = 'لون أخضر'؛Umap['تين'] = 'نفسجي'؛

unordered_map<مقدار ثابت شار* ، مقدار ثابت شار*> ::مكررالتكرار=Umap.يبدأ()؛
زوج<مقدار ثابت شار* ، مقدار ثابت شار*>العلاقات العامة= *التكرار؛
كلفة<<العلاقات العامة.أول << '،' <<العلاقات العامة.ثانيا << 'ن'؛

الخرج هو: التين ، البنفسجي. الخريطة غير مرتبة.

تبدأ () const noexcept؛

إرجاع مكرر يشير إلى العنصر الأول في مجموعة كائن الخريطة. عندما يسبق بناء الكائن بـ const ، يتم تنفيذ التعبير start () const بدلاً من start (). في ظل هذا الشرط ، لا يمكن تعديل العناصر الموجودة في الكائن. يتم استخدامه في الكود التالي ، على سبيل المثال.

مقدار ثابتunordered_map<مقدار ثابت شار* ، مقدار ثابت شار*>Umap({{'موز'و 'أصفر'}و
{'عنب'و 'لون أخضر'}و {'تين'و 'نفسجي'}})؛

unordered_map<مقدار ثابت شار* ، مقدار ثابت شار*> ::المُحددالتكرار=Umap.يبدأ()؛
زوج<مقدار ثابت شار* ، مقدار ثابت شار*>العلاقات العامة= *التكرار؛
كلفة<<العلاقات العامة.أول << '،' <<العلاقات العامة.ثانيا << 'ن'؛

الخرج هو: التين ، البنفسجي. الخريطة غير مرتبة. لاحظ أنه تم استخدام const_iterator هذه المرة ، بدلاً من مجرد مكرر ، لتلقي المكرر المرتجع.

النهاية () باستثناء

إرجاع مكرر يشير مباشرة إلى ما بعد العنصر الأخير في كائن الخريطة.

end () const noexcept

إرجاع مكرر يشير مباشرة إلى ما بعد العنصر الأخير في كائن الخريطة. عندما يُسبَق إنشاء كائن الخريطة بـ const ، يتم تنفيذ التعبير end () const بدلاً من end ().

عمليات unordered_map

البحث عن المكرر (const key_type & k)

يبحث عن زوج من المفتاح المحدد في الخريطة. إذا تم العثور عليه ، فإنه يعيد مكرر. إذا لم يتم العثور عليه ، فإنه يُرجع مكررًا يشير إلى نهاية الخريطة ، وهو ليس زوجًا. يوضح الكود التالي كيفية استخدام وظيفة العضو هذه:

unordered_map<شاروشار>Umap؛

Umap['إلى'] = 'ب'؛Umap['ج'] = 'د'؛Umap['و'] = 'F'؛

unordered_map<شاروشار> ::مكررالتكرار=Umap.تجد('ج')؛
لو (Umap.تجد('ج') ! =Umap.نهاية())
{
زوج<شاروشار>العلاقات العامة= *التكرار؛
كلفة<<العلاقات العامة.أول << '،' <<العلاقات العامة.ثانيا << 'ن'؛
}

الخرج هو: ج ، د

العثور على const_iterator (const key_type & k) const ؛

يسمى هذا الإصدار من الوظيفة ، إذا بدأ إنشاء الخريطة غير المرتبة بـ const ، مما يجعل جميع عناصر الخريطة للقراءة فقط.

معدِّلات خريطة unordered_map

إدراج الزوج (value_type && obj)
تعني الخريطة غير المرتبة أن الأزواج ليست بأي ترتيب. لذلك ، يقوم البرنامج بإدراج الزوج في أي مكان يراه مناسبًا. ترجع الدالة زوج. إذا كان الإدراج ناجحًا ، فسيكون bool 1 لـ true ، وإلا فسيكون 0 للخطأ. إذا كان الإدراج ناجحًا ، فسيقوم المكرر بالإشارة إلى العنصر المدرج حديثًا. يوضح الكود التالي الاستخدام:

unordered_map<مقدار ثابت شار* ، مقدار ثابت شار*>Umap؛

Umap['موز'] = 'أصفر'؛
Umap['عنب'] = 'لون أخضر'؛
Umap['تين'] = 'نفسجي'؛

Umap.إدراج({{'الكرز'و 'صافي'}و {'الفراولة'و 'صافي'}})؛

كلفة<<Umap.بحجم() << 'ن'؛

الناتج هو: 5. يمكن إدراج أكثر من زوج واحد.

size_type erase (const key_type & k)

هذه الوظيفة تمحو زوج من unordered_map. يوضح مقطع الكود التالي:

unordered_map<مقدار ثابت شار* ، مقدار ثابت شار*>Umap؛

Umap['موز'] = 'أصفر'؛
Umap['عنب'] = 'لون أخضر'؛
Umap['تين'] = 'نفسجي'؛

intعلى واحد=Umap.محو('عنب')؛

كلفة<<Umap.بحجم() << 'ن'؛

الإخراج هو 2.
مبادلة باطلة (خريطة_غير مرتبة &)
يمكن تبديل خريطتين غير مرتبتين ، كما هو موضح في مقطع الكود هذا:

unordered_map<مقدار ثابت شار* ، مقدار ثابت شار*>umap1= {{'موز'و 'أصفر'}و
{'عنب'و 'لون أخضر'}و {'تين'و 'نفسجي'}و {'الفراولة'و 'صافي'}}؛

unordered_map<مقدار ثابت شار* ، مقدار ثابت شار*>umap2= {{'الكرز'و 'صافي'}و {'جير'و 'لون أخضر'}}؛

umap1.مبادلة، مقايضة(umap2)؛

unordered_map<مقدار ثابت شار* ، مقدار ثابت شار*> ::مكررiter1=umap1.يبدأ()؛
زوج<مقدار ثابت شار* ، مقدار ثابت شار*>PR1= *iter1؛
unordered_map<مقدار ثابت شار* ، مقدار ثابت شار*> ::مكررiter2=umap2.يبدأ()؛
زوج<مقدار ثابت شار* ، مقدار ثابت شار*>PR2= *iter2؛

كلفة<< 'المفتاح الأول وحجم umap1:'<<PR1.أول <<'،'<<umap1.بحجم() << 'ن'؛
كلفة<< 'المفتاح الأول وحجم UMAP2'<<PR2.أول <<'،'<<umap2.بحجم() << 'ن'؛
unordered_map<مقدار ثابت شار* ، مقدار ثابت شار*>umap1= {{'موز'و 'أصفر'}و
{'عنب'و 'لون أخضر'}و {'تين'و 'نفسجي'}و {'الفراولة'و 'صافي'}}؛
unordered_map<مقدار ثابت شار* ، مقدار ثابت شار*>umap2= {{'الكرز'و 'صافي'}و {'جير'و 'لون أخضر'}}؛

umap1.مبادلة، مقايضة(umap2)؛

unordered_map<مقدار ثابت شار* ، مقدار ثابت شار*> ::مكررiter1=umap1.يبدأ()؛
زوج<مقدار ثابت شار* ، مقدار ثابت شار*>PR1= *iter1؛
unordered_map<مقدار ثابت شار* ، مقدار ثابت شار*> ::مكررiter2=umap2.يبدأ()؛
زوج<مقدار ثابت شار* ، مقدار ثابت شار*>PR2= *iter2؛

كلفة<< 'المفتاح الأول وحجم umap1:'<<PR1.أول <<'،'<<umap1.بحجم() << 'ن'؛
كلفة<< 'المفتاح الأول وحجم UMAP2'<<PR2.أول <<'،'<<umap2.بحجم() << 'ن'؛

الخرج هو:

المفتاح الأول وحجم umap1: الجير ، 2

المفتاح الأول وحجم الفراولة umap2 ، 4

الخريطة غير مرتبة. لاحظ أنه يتم زيادة طول الخريطة إذا لزم الأمر. يجب أن تكون أنواع البيانات متطابقة.

الفئة وكائناتها المتشابهة

القيمة هي نوع بيانات ، حيث أن الكائن الذي تم إنشاء مثيل له هو فئة. يمكن أن يقبل إنشاء الخريطة غير المرتبة أيضًا فئة كنوع بيانات. البرنامج التالي يوضح هذا:

#يشمل
#يشمل
استخدام اسم للمحطة؛

فئة TheCla
{
عام:
intعلى واحد؛
ثابتة شارالفصل؛

فارغوظيفة(شارلاو مقدار ثابت شار *ص)
{
كلفة<< 'يوجد ' <<على واحد<< 'كتب تستحق' <<لا<<ص<< ' في المتجر.' << 'ن'؛
}
ثابتة فارغمرح(شارالفصل)
{
لو (الفصل== 'إلى')
كلفة<< 'وظيفة العضو الرسمية الثابتة' << 'ن'؛
}
}؛

intالأساسية()
{
TheCla obj1؛TheCla obj2؛TheCla obj3؛TheCla obj4؛TheCla obj5؛

unordered_map<مقدار ثابت شار* ،TheCla>Umap؛
Umap= {{'موز'وobj1}و {'عنب'وobj2}و {'تين'وobj3}و {'الفراولة'وobj4}و {'جير'وobj5}}؛

كلفة<<Umap.بحجم() << 'ن'؛

إرجاع 0؛
}

الخرج هو: 5.

يحتوي تعريف الفئة على عضوين من أعضاء الجمهور ووظيفتين من وظائف الأعضاء العامة. في الدالة main () ، يتم إنشاء كائنات مختلفة للفئة. ثم يتم إنشاء مثيل لخريطة غير مرتبة ، حيث يتكون كل زوج من اسم فاكهة وكائن من الفئة. يتم عرض حجم الخريطة. يقوم البرنامج بالتجميع بدون رسالة تحذير أو خطأ.

تطبيق الخريطة

المصفوفة تربط الفهرس بالقيمة. توجد أزواج المفاتيح / القيم في العديد من المواقف في الحياة ، والتي يمكن برمجتها. زوج المفتاح / القيمة من الفاكهة / اللون هو مجرد مثال واحد. مثال آخر هو اسم الناس وأعمارهم. في هذه الحالة ، سيكون الزوج من النوع ، الزوج. يمكن أن يكون أيضًا زوجًا. في الحالة الأخيرة ، سيتم استخدام توجيه ما قبل المعالجة. لا يزال من الممكن أن يكون زوج المفتاح / القيمة أسماء الأزواج. في البلدان التي يوجد فيها تعدد الزوجات ، ستكون هناك زوجات مختلفات للرجل الواحد.

تشكيل الخريطة

الخريطة ليست مصفوفة ثنائية الأبعاد ، تتكون من عمودين. تعمل الخريطة مع وظيفة التجزئة. يتم ترميز المفتاح بواسطة دالة التجزئة إلى عدد صحيح من المصفوفة. هذه المجموعة هي التي تحمل القيم. لذلك ، هناك بالفعل مصفوفة واحدة تحتوي على القيم ، ويتم تعيين المفاتيح لمؤشرات المصفوفة ، وبالتالي يتم إجراء المراسلات بين المفاتيح والقيم. التجزئة موضوع شامل ولا يتم تناوله في هذه المقالة.

استنتاج

الخريطة ، المعروفة أيضًا باسم المصفوفة الترابطية ، هي قائمة بالعناصر ، حيث يكون كل عنصر عبارة عن زوج مفتاح / قيمة. لذلك ، كل مفتاح يتوافق مع قيمة. في C ++ ، يتم تنفيذ الخريطة كهيكل بيانات مع وظائف الأعضاء والمشغلين. الخريطة المرتبة هي الخريطة التي تم ترتيب أزواج العناصر فيها بواسطة المفاتيح. الخريطة غير المرتبة هي الخريطة التي لا يوجد فيها ترتيب.

من الناحية الفنية ، تتكون التجزئة من عناصر زوجية. في الواقع ، الزوج عبارة عن بنية بيانات كاملة مع وظائف الأعضاء والمشغلين. معلمتا القالب للزوج هي نفس معلمتين للقالب unordered_map.

قائمة التهيئة للخريطة عبارة عن مصفوفة حرفية من القيم. يتكون كل حرف داخلي من كائنين ، زوج المفتاح / القيمة.

يمكن تصنيف وظائف الأعضاء والمشغلين لـ unordered_map تحت العناوين التالية: unordered_map build / copy build ، unordered_map Capacity ، unordered_map iterator ، unordered_map Operations ، و unordered_map Modifiers.

يتم استخدام خريطة غير مرتبة عند تعيين مفتاح إلى قيمة.

كريس