البرمجة

تحسين برمجة قاموس الحروف في C++

في محاولتك لإنشاء فئة تشبه القاموس في C++، تواجه مشكلة حيث يتم استبدال المفتاح بشكل متكرر. يظهر أنك تحاول البحث عن الحروف في نطاق “x” من الحرف الحالي، ومن ثم إضافتها إلى مجموعة تمثل قيمة القاموس في هذا السياق.

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

يمكن أن يكون السبب وراء ذلك في ترتيب الشفرة. في لغة C++، يجب عليك استخدام الأقواس لتحديد نطاق العبارة المشروطة في هيكل التحكم if. في الشيفرة التي قدمتها، يبدو أن هناك جزءاً من الشفرة يفتقد إلى الأقواس الكافية.

لتصحيح الكود، قم بتوسيع النطاق باستخدام الأقواس كما يلي:

cpp
for (unsigned int x = 0; x < word.length(); x++) { if (!map.has_key(word[x])) { std::cout << "CREATING " << word[x] << std::endl; map[word[x]] = ics::ArraySet<char>(); map[word[x]].insert(word[x]); } for (int y = 0; y < dist; y++) { std::cout << "HELLO!" << std::endl; if ((x + y) < word.length()) { std::cout << "ADDING " << word[x + y] << std::endl; map[word[x]].insert(word[(x + y)]); } if ((x - y) >= 0) { map[word[x]].insert(word[(x - y)]); } } }

بوجود هذه التعديلات، يجب أن يتم الآن تنفيذ الشرط بشكل صحيح ويتم إنشاء المفاتيح فقط إذا لم تكن موجودة مسبقًا في القاموس. يرجى تجربة هذا التعديل ومراجعة نتائجك.

المزيد من المعلومات

بالطبع، دعنا نستكشف بعض المعلومات الإضافية حول المشكلة التي تواجهك في برمجة قاموس في C++، وكيف يمكن تحسين الكود لتحقيق النتائج المرجوة.

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

أولًا، يمكنك استخدام عنصر من نوع std::unordered_map بدلاً من الفئة التي قد تكون قد كتبتها (ics::ArraySet). هذا يمكن أن يسهل الكود ويجعله أكثر فهمًا. الاستفادة من مكتبة القواميس (std::unordered_map) تجعل الشيفرة أقل تعقيدا وأكثر فعالية.

ثانيًا، لتجنب إعادة إنشاء المفاتيح في كل مرة، يمكنك استخدام دالة emplace لإضافة المفاتيح إلى القاموس إذا لم تكن موجودة مسبقًا. هذا يقلل من التكرار ويحسن الأداء.

اليك تحسين للكود:

cpp
#include #include #include #include int main() { std::string word = "racecar"; int dist = 2; std::unordered_map<char, std::unordered_set<char>> map; for (unsigned int x = 0; x < word.length(); x++) { auto& charSet = map[word[x]]; charSet.emplace(word[x]); // إنشاء المفتاح إذا لم يكن موجودًا for (int y = 1; y <= dist; y++) { if ((x + y) < word.length()) { charSet.emplace(word[x + y]); } if ((x - y) >= 0) { charSet.emplace(word[x - y]); } } } // طباعة النتائج for (const auto& entry : map) { std::cout << "dictionary('" << entry.first << "' -> {"; for (const auto& value : entry.second) { std::cout << value << ","; } std::cout << "})" << std::endl; } return 0; }

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

زر الذهاب إلى الأعلى