الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

اختبر فهمك لـ std::map في حل هذه المشكلة

بدأه مصطفى 36a2 في 28 يوليو 2014 · 0 رد · 746 مشاهدة · في لغة C و ++C
مشاركة: واتساب X فيسبوك تيليجرام
#1

السلام عليكم ورحمة الله ويركاته وكل عام وأنتم بخير

أثناء إحدى التجارب الخطيرة على std::map ظهرت مشكلة غريبة جداً جداً .. بالفعل .
وبعد أن عرفت سبب المشكلة (وهي في لب أساسيات فهم الـ map ) وجدت أنه سؤال جيد ليطرح كاختبار

إليكم الكود :

بعد تعريف المكتبات اللازمة , واستخدام نطاق الأسماء المعياري :

#include <iostream>
#include <map>
using namespace std;

قمت بتعريف هيكل struct كما يلي

struct rect{
    int a_x,a_y,b_x,b_y;
    rect(int a,int b,int c,int d){
        a_x=min(a,c);a_y=min(b,d);
        b_x=max(a,c);b_y=max(b,d);
    }
};

وسأستخدمه كمفتاح key بداخل الـmap لاحقاً ..

ولذلك قمت بتعريف العملية > لأن الـmapه لا تعرف كيف تقارن هذا النوع الجديد عند تريبه (حيث يتم تنفيذها كـbalanced tree )

المهم , التعريف هو كما يلي :

bool operator<(const rect &y,const rect &x){
        if(y.a_x>x.a_x)
            return false;
        else if(y.a_y>x.a_x)
            return false;
        return true;
    }

أخيراً عرفت الـmap

map<rect,int> my_map;

والآن إلى السؤال , الدالة الرئيسية main بداخلها الكود التالي :

int main()
{
    for(int i=0;i<3;i++)
        for(int j=0;j<3;j++)
            {
                my_map[rect(i,j,i,j)]=i*j;
                cout<<( my_map.find(rect(i,j,i,j))==my_map.end() ?"VERY BAD":"GOOD")<<endl;
            }
    return 0;
}

بداخل الحلقتين , يتم إدخال عنصر جديد في الـmap مفتاحه هو كائن جديد من rect , ويتم إسناد القيمة value إلى هذا المفتاح key بطريقة عشوائية ( اخترت i*j للسهولة )

في سطر الإخراج الوحيد بعد ذلك , أطلب من الـ map البحث عن العنصر الذي أدخلته للتو , ((للتو يا جماعة ))

والمفترض أن تكون النتيجة 100% تم العذور على العنصر .
ولكن للمصادفة , بعض العناصر تعثر عليها والآخر يضيع !! وبالتالي ترى الخرج بين Good و Very Bad !

فكيف يمكن لهذا أن يحدث ؟

(ملاحظة : لحل السؤال تحتاج لمعرفة جيدة في أساسيات ومبادئ عمل الـ map ولتفسير الخرج عليك فهم الـ implementation الخاص بها كـ tree )

 

بالتوفيق للجميع

 

أخيراً وكعادة أرجو من كل من يريد وضع الأسئلة والألغاز أن يتبعها , سأضع إجابة هذا السؤال مشفرة بطريقة ما , لإزالة أي شبهة حول عدم معرفتي للجواب بصفتي واضع السؤال ,

دقلةظقلذققرنةظغيرظصقلحةظللقستخدقذظفهيظأولقظلقظتشذلظجذيعظقلحقلقتظوثقنيقًظلقظتحققظقوقنينظقلذققرنةظذثلظأنظيكونظذقظليسظأصغرظولقظأكبرظفهوظيسقويظوذقظإلىظذلكظو

قلحلظيكونظبشذلظجذيعظحقلقتظقلذققرنةظأوظعلىظقلأقلظعدذظإعطقءظقلتنققضظ:ظذقظليسظأكبرظولقظأصغرظفيذكنظأنظيكونظلقظيسقويظأيضقًظوهذقظقلقبيل

1

مواضيع مشابهة