السلام عليكم ورحمة الله ويركاته وكل عام وأنتم بخير
أثناء إحدى التجارب الخطيرة على 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 )
بالتوفيق للجميع
أخيراً وكعادة أرجو من كل من يريد وضع الأسئلة والألغاز أن يتبعها , سأضع إجابة هذا السؤال مشفرة بطريقة ما , لإزالة أي شبهة حول عدم معرفتي للجواب بصفتي واضع السؤال ,
دقلةظقلذققرنةظغيرظصقلحةظللقستخدقذظفهيظأولقظلقظتشذلظجذيعظقلحقلقتظوثقنيقًظلقظتحققظقوقنينظقلذققرنةظذثلظأنظيكونظذقظليسظأصغرظولقظأكبرظفهوظيسقويظوذقظإلىظذلكظو
قلحلظيكونظبشذلظجذيعظحقلقتظقلذققرنةظأوظعلىظقلأقلظعدذظإعطقءظقلتنققضظ:ظذقظليسظأكبرظولقظأصغرظفيذكنظأنظيكونظلقظيسقويظأيضقًظوهذقظقلقبيل