सी ++ कास्ट मैप एलिमेंट एक्सेस


101

मैंने संचालक का उपयोग करने की कोशिश की [] कास्ट सी ++ मैप में तत्व का उपयोग करें, लेकिन यह विधि विफल रही। मैंने भी यही काम करने के लिए "at ()" का उपयोग करने की कोशिश की। इस बार काम किया। हालाँकि, मुझे किसी कॉन्स्टेंट C ++ मैप में एलिमेंट एक्सेस करने के लिए "at ()" का उपयोग करने के बारे में कोई संदर्भ नहीं मिला। C ++ के नक्शे में एक नया जोड़ा गया कार्य "at ()" है? मुझे इस बारे में अधिक जानकारी कहां मिल सकती है? आपका बहुत बहुत धन्यवाद!

एक उदाहरण निम्नलिखित हो सकता है:

#include <iostream>
#include <map>

using namespace std;

int main()
{
        map<int, char> A;
        A[1] = 'b';
        A[3] = 'c';

        const map<int, char> B = A;

        cout << B.at(3) << endl; // it works
        cout << B[3] << endl;  // it does not work

}

"बी [3]" का उपयोग करने के लिए, इसने संकलन के दौरान निम्नलिखित त्रुटियों को लौटाया:

t01.cpp: 14: त्रुटि: 'कास्ट एसटीडी :: नक्शा, एसटीडी :: एलोकेटर>>' के रूप में यह '_Tp & std :: मैप <_Key, _Tp, _Compare, _Alloc :: ऑपरेटर [] का तर्क const _Key &) [_Key = int, _Tp = char, _Compare = std :: less, _Alloc = std :: एलोकेटर के साथ] '' पात्र योग्यताधारी

उपयोग किया गया कंपाइलर g ++ 4.2.1 है

जवाबों:


124

at()std::mapC ++ 11 के लिए एक नई विधि है ।

एक नया डिफ़ॉल्ट निर्मित तत्व सम्मिलित करने के बजाय, operator[]यदि दी गई कुंजी वाला कोई तत्व मौजूद नहीं है, तो यह एक std::out_of_rangeअपवाद फेंकता है। (यह के at()लिए dequeऔर के व्यवहार के समान है vector।)

इस व्यवहार के कारण यह समझ में आता है कि वहाँ पर एक constअधिभार है at(), operator[]जिसके विपरीत हमेशा नक्शा बदलने की क्षमता होती है।


क्या अपवाद को फेंकने के बजाय डिफ़ॉल्ट मूल्य पर "वापसी" संभव है?
user1202136

मैं at()VS2013 के साथ VS2010 टूलकिट का उपयोग करने के लिए एक परियोजना सेट पर उपयोग कर रहा हूं । मैंने सोचा था कि मैं C ++ 11 का उपयोग नहीं कर रहा था ... लेकिन अभी तक यह संकलन करता है ... ??
थोमथोम

1
मुझे केवल यह टिप्पणी करने की आवश्यकता है कि यह कांस्ट संचालक को छोड़ देने का कोई मतलब नहीं है [], जो नक्शे को बदलने के बजाय एक अनमैप्ड तत्व के लिए अपवाद भी फेंक सकता है।
स्पेंसर

@ स्पेंसर यह आश्चर्य की बात होगी अगर ऑपरेटर के गैर-कब्ज वाले अधिभार और [] अलग प्रभाव थे। आम तौर पर, हम उम्मीद करते हैं कि यदि किसी कार्यक्रम में कुछ गैर-कास्ट ऑब्जेक्ट्स या संदर्भों को कॉस्ट किया जाता है, तो प्रोग्राम उसी तरह से व्यवहार करना जारी रखेगा, जब तक वह संकलित करता है। अपवादों को फेंकने के लिए केवल गैर-कॉन्स्टेबल अधिभार की अनुमति देने से उन बगों का परिणाम हो सकता है जो रनटाइम तक पकड़े नहीं जाते हैं।
ब्रायन

@ ब्रायन क्या आपके कहने का मतलब है " अपवादों को फेंकने के लिए केवल कांस्ट ओवरलोड की वजह से"?
स्पेंसर

33

यदि कोई तत्व अस्तित्व में नहीं है map, तो operator []इसे जोड़ देगा - जो स्पष्ट रूप से constमानचित्र में काम नहीं कर सकता है इसलिए C ++ constऑपरेटर के एक संस्करण को परिभाषित नहीं करता है । यह संकलक के प्रकार चेकर के संभावित रनटाइम त्रुटि को रोकने का एक अच्छा उदाहरण है।

आपके मामले में, आपको findइसके बजाय उपयोग करने की आवश्यकता है जो केवल (पुनरावृत्ति) तत्व को वापस करेगा यदि यह मौजूद है, तो यह कभी भी संशोधित नहीं होगा map। यदि कोई आइटम मौजूद नहीं है, तो यह मैप के लिए एक पुनरावृत्ति देता है end()

atमौजूद नहीं है और संकलन भी नहीं करना चाहिए। शायद यह एक "संकलक विस्तार" (=) हैएक दोष C ++ 0x में नया)।


क्या C ++ मानक लाइब्रेरी कक्षाओं में अतिरिक्त गैर-मानक सदस्य कार्यों को परिभाषित करने से कार्यान्वयन को मना करता है?
टिम मार्टिन

@ मुझे लगता है कि इंटरफ़ेस तय हो गया है, हाँ।
कोनराड रुडोल्फ

4

[] -ओपिटर दिए गए कुंजी मौजूद नहीं होने पर नक्शे में एक नई प्रविष्टि बनाएगा । इस प्रकार यह नक्शा बदल सकता है।

इस लिंक को देखें ।


2

यह मेरे लिए काफी आश्चर्य की बात है, लेकिन एसटीएल के नक्शे में कोई constइंडेक्स ऑपरेटर नहीं है । यह B[3]केवल पढ़ा नहीं जा सकता है। मैनुअल से:

चूंकि ऑपरेटर [] नक्शे में एक नया तत्व सम्मिलित कर सकता है, यह संभवतः एक कांस्ट सदस्य फ़ंक्शन नहीं हो सकता है।

मुझे इसके बारे में कोई पता नहीं है at()

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.