سؤال

هل هناك سبب لتمرير إشارة إلى a std::map كما يتسبب const في كسر عامل التشغيل []؟أحصل على خطأ المترجم هذا (gcc 4.2) عندما أستخدم const:

خطأ:لا تطابق مع "المشغل [] في "الخريطة [الاسم]

إليك النموذج الأولي للوظيفة:

void func(const char ch, std::string &str, const std::map<std::string, std::string> &map);

ويجب أن أذكر أنه لا توجد مشكلة عندما أقوم بإزالة ملف const الكلمة الأساسية أمام std::map.

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

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

هل كانت مفيدة؟

المحلول

نعم لا يمكنك استخدام operator[]. استخدام find، ولكن لاحظ أن تقوم بإرجاع const_iterator بدلا من iterator:

std::map<std::string, std::string>::const_iterator it;
it = map.find(name);
if(it != map.end()) {
    std::string const& data = it->second;
    // ...
}

وانها مثل مع مؤشرات. لا يمكنك تعيين int const* إلى int*. وبالمثل، لا يمكنك تعيين const_iterator إلى iterator.

نصائح أخرى

عند كنت تستخدم مشغل []، الأمراض المنقولة جنسيا :: خريطة بالبحث عن البند مع مفتاح معين. إذا لم تجد أي، فإنه يخلق ذلك. ومن هنا تأتي مشكلة مع CONST.

استخدم العثور على طريقة وسوف يكون على ما يرام.

هل يمكن أن يرجى الرد على التعليمات البرمجية على كيف كنت تحاول استخدام البحث ()؟ ان الطريق الصحيح هو:

if( map.find(name) != map.end() )
{
   //...
}

إذا كنت تستخدم C++11، الأمراض المنقولة جنسيا::خريطة::في يجب أن تعمل من أجلك.

السبب الأمراض المنقولة جنسيا::خريطة::operator[] لا يعمل الأمر هو أنه في حالة عدم وجود المفتاح الذي تبحث عنه في الخريطة، فسيتم إدراج عنصر جديد باستخدام المفتاح المقدم وإرجاع مرجع إليه (راجع الرابط للحصول على التفاصيل).هذا غير ممكن على const std::map.

ومع ذلك، فإن الطريقة "at" ستطرح استثناءً في حالة عدم وجود المفتاح.ومع ذلك، ربما تكون فكرة جيدة التحقق من وجود المفتاح باستخدام الطريقة std::map::find قبل محاولة الوصول إلى العنصر باستخدام الطريقة 'at'.

وربما لعدم وجود مشغل CONST [] في الأمراض المنقولة جنسيا :: الخريطة. مشغل [] سيضيف عنصر كنت تبحث عن إذا كان لا العثور عليه. لذلك، استخدم طريقة البحث () إذا كنت ترغب في البحث دون إمكانية إضافة.

لبك "أخطاء مكرر متطابقة CONST":

والبحث () اثنين الزائدة:

      iterator find ( const key_type& x );
const_iterator find ( const key_type& x ) const;

وبي <م> تخمين هو أنك الحصول على هذا الخطأ لأنك تفعل شيئا مثل تعيين مكرر غير CONST (على اليسار) إلى نتيجة مكالمة find() على خريطة const:

iterator<...> myIter /* non-const */ = myConstMap.find(...)

وهذا من شأنه أن يؤدي إلى خطأ، على الرغم ربما ليست واحدة ترونه.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top