C ++ المرتجع خريطة الوصول تصفيات (CONST)
سؤال
والتعليمة البرمجية التالية يقول أن يمر الخريطة كما 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 القيام بذلك. تذكر، يكتبون مترجم الخاصة بهم، حتى أنها قد تكون قادرة على الابتعاد معها. وحتى مع ذلك، انها فكرة سيئة.
والمشغل [] بإرجاع مرجع فحسب، بل في الواقع يخلق دخول في الخريطة. حتى انك لا مجرد الحصول على رسم الخرائط، وإذا كان هناك لا شيء، كنت تقوم بإنشاء واحد. هذا ليس ما تريده.