2015-07-09 9 views
6

का उपयोग कर मानचित्र का दूसरा क्षेत्र प्राप्त करने में असमर्थ मैं कुछ प्रमुख मूल्य जोड़े को स्टोर करने के उद्देश्य से सीखने के लिए मानचित्र बना रहा हूं। यदि मैं begin() फ़ंक्शन का उपयोग करके मानचित्र के दूसरे फ़ील्ड को प्रिंट करता हूं तो मैं मानचित्र के दूसरे फ़ील्ड को प्रिंट करने में सक्षम हूं लेकिन जब मैं end() का उपयोग करके मानचित्र के अंतिम तत्व के साथ ऐसा करने का प्रयास करता हूं तो यह दूसरे फ़ील्ड को मुद्रित करने में सक्षम नहीं है। नीचे मेरी कोड है:अंत()

#include <iostream> 
#include <cstdlib> 
#include <map> 
#include <string> 
#include <stdio.h> 


using namespace std; 

map<int,std::string> arr; 

map<int,std::string>::iterator p; 

int main(int argc, char** argv) { 

    arr[1] = "Hello"; 
    arr[2] = "Hi"; 
    arr[3] = "how"; 
    arr[4] = "are"; 
    arr[5] = "you"; 

    p = arr.begin(); 
    printf("%s\n",p->second.c_str()); 

    p = arr.end(); 
    printf("%s\n",p->second.c_str()); 

    return 0; 

} 
+3

एसटीएल कंटेनरों के लिए, ".end()" "1 पास्ट एंड-तत्व" भी देखने के लिए एक इटरेटर अर्जित करता है।कॉम/प्रश्न/15252002/क्या-द-द-एंड-द-एंड-इटरेटर-इन-एसएलएल-सी – user2950911

उत्तर

2

पिछले तत्व को मुद्रित करने के reverse iterator का उपयोग करें:

map< int,std::string>::reverse_iterator p; 
p = arr.rbegin(); 
if(p != arr.rend()) { 
    // Do whatever with, it points to the last element 
} else { 
    // map is empty 
} 

std::map::end एक अतीत पिछले तत्व के लिए इटरेटर वापस आ जाएगी और यह अपसंदर्भन अपरिभाषित व्यवहार है।

std::map::end से en.cppreference

पर कंटेनर के अंतिम तत्व निम्नलिखित तत्व को एक iterator देता है। यह तत्व प्लेसहोल्डर के रूप में कार्य करता है; इसे तक पहुंचने का प्रयास अपरिभाषित व्यवहार में परिणाम। http: // stackoverflow

1

std :: SOMETHING.end() पिछले तत्व वापस नहीं करता है, यह अतीत-अंत तत्व देता है। सी ++ documentation देखें। संक्षेप में आप जो कर रहे हैं वह अपरिभाषित स्मृति स्थान को अपमानित करने का प्रयास कर रहा है।

6

end()undefined behaviorend()end() के रूप में मानचित्र के अंत में 1 पुनरावर्तक लौटाता है। आप पिछले तत्व चाहते हैं तो आपको

p = --arr.end(); 

उपयोग कर सकते हैं आप

p = arr.rbegin() 

उपयोग नहीं कर सकते यदि आप एक आगे इटरेटर (live example) करने के लिए एक रिवर्स इटरेटर असाइन नहीं कर सकते हैं। यदि आप rbegin() का उपयोग करना चाहते हैं तो आपको एक रिवर्स इटरेटर बनाना होगा।

map<int,std::string>::reverse_iterator rit; 
rit = arr.rbegin(); 

// or 

auto rit = arr.rebegin(); //C++11 or higher required for this 

या आप visitor

द्वारा एक आगे इटरेटर this answer उपयोग करने के लिए रूपांतरित कर सकते हैं हमेशा की तरह क्या आप वाकई एक वैध इटरेटर है कि बनाने के लिए जाँच करनी चाहिए। यदि कंटेनर खाली है begin() == end() और अपरिवर्तनीय या तो अपरिभाषित व्यवहार है।

स्रोत: http://en.cppreference.com/w/cpp/container/map/end

+1

"' start() == end() '" - मुझे लगता है कि 'arr.empty() 'स्पष्ट है । यह भी तेज हो सकता है। –

+0

@NO_NAME मैं बस यह दिखा रहा था कि कंटेनर खाली होने पर 'start()' का उपयोग 'end() 'जैसा ही है। – NathanOliver

2

आप --arr.end() या arr.rbegin() उपयोग कर सकते हैं।

arr.end() अंतिम तत्व के बाद तत्व को पुनरावर्तक देता है। यह आसान लेखन loops की अनुमति देता है। यह तत्व केवल तुलना करने के लिए है। इसे अस्वीकार करने की अनुमति नहीं है।

1

जैसा कि पहले से ही अन्य पदों में बताया गया है end() मानचित्र में अंतिम तत्व के पीछे एक पुनरावर्तक है। इस प्रकार आपको अपने खेतों को पाने की कोशिश नहीं करनी चाहिए। अंतिम तत्व प्राप्त करने के लिए आप rbegin() का उपयोग कर सकते हैं।

संबंधित मुद्दे