سؤال

والتعليمة البرمجية التالية يقول أن يمر الخريطة كما const في طريقة operator[] يتجاهل التصفيات المؤهلة ل:

#include <iostream>
#include <map>
#include <string>

using namespace std;

class MapWrapper {
public:
    const int &get_value(const int &key) const {
        return _map[key];
    }

private:
    map<int, int> _map;
};

int main() {
    MapWrapper mw;
    cout << mw.get_value(42) << endl;
    return 0;
}

هل هذا بسبب تخصيص الممكن أن يحدث على خريطة الوصول؟ يمكن المنافذ يتم الإعلان عن أي وظائف مع خريطة CONST؟

وMapWrapper.cpp:10: error: passing ‘const std::map<int, int, std::less<int>, std::allocator<std::pair<const int, int> > >’ as ‘this’ argument of ‘_Tp& std::map<_Key, _Tp, _Compare, _Alloc>::operator[](const _Key&) [with _Key = int, _Tp = int, _Compare = std::less<int>, _Alloc = std::allocator<std::pair<const int, int> >]’ discards qualifiers

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

المحلول

لم يتم التصريح

std::map في operator [] كما const، ولا يمكن أن يكون بسبب سلوكها:

<اقتباس فقرة>   

& T التشغيل [] (CONST مفتاح والمفتاح)

     

وإرجاع إشارة إلى القيمة التي تم تعيينها إلى ما يعادل مفتاح المفتاح، وأداء الإدراج إذا كان هذا المفتاح غير موجود بالفعل.

ونتيجة لذلك، وظيفة الخاص بك لا يمكن أعلن const، واستخدام operator[] خريطة ل.

std::map وظيفة find() يسمح لك للبحث عن مفتاح دون تعديل الخريطة.

find() بإرجاع iterator، أو const_iterator إلى <أ href ل = "http://en.cppreference.com/w/cpp/utility/pair" يختلط = "noreferrer"> std::pair تحتوي على كل مفتاح (.first) وقيمة (.second).

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

نصائح أخرى

ولا يمكنك استخدام operator[] على الخريطة التي const كما أن طريقة لا const لأنها تسمح لك لتعديل الخريطة (يمكنك أن تخصص _map[key]). حاول استخدام طريقة find بدلا من ذلك.

operator[] لايوجد الزائد-CONST المؤهلين، فإنه لا يمكن أن يكون استخدامها بأمان في الوظائف CONST المؤهلين. وربما هذا هو لأنها بنيت الزائد الحالي بهدف العودة وتحديد القيم الأساسية على حد سواء.

وبدلا من ذلك، يمكنك استخدام:

VALUE = map.find(KEY)->second;

وأو في C ++ 11، يمكنك استخدام at() المشغل:

VALUE = map.at(KEY);

وبعض إصدارات أحدث من رؤوس دول مجلس التعاون الخليجي (4.1 و 4.2 على الجهاز الخاص بي) لديها غير القياسية وظائف الأعضاء خريطة :: في () التي أعلن CONST ورمي الأمراض المنقولة جنسيا :: out_of_range إذا لم يكن المفتاح في الخريطة.

const mapped_type& at(const key_type& __k) const

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

أولا، يجب أن لا تستخدم رموز بدءا _ لأنها محجوزة للكاتب لغة التنفيذ / مترجم. سيكون من السهل جدا ل_map أن يكون خطأ في بناء الجملة على مترجم لشخص ما، وسيكون لديك فلا يلومن إلا نفسك.

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

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

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