27

मैं इस कोडसी ++ मानक std :: वेक्टर <int> v1, v2 के बारे में क्या कहता है; std :: दूरी (v1.begin(), v2.begin())?

#include <vector> 
#include <iostream> 

int main(int argc, char* argv[]) 
{ 
    std::vector<int> v1,v2; 
    std::cout << std::distance(v1.begin(),v2.begin()); 
    return 0; 
} 

है और यह एक बग है, क्योंकि यह दो अलग अलग वैक्टर की iterators तुलना करने के लिए सार्थक नहीं है।

मैं पेज 815 पर 24.4.4 इटरेटर संचालन पर N3376 पर एक नज़र था:

template<class InputIterator> 
typename iterator_traits<InputIterator>::difference_type 
distance(InputIterator first, InputIterator last); 

आवश्यक है: InputIterator रैंडम एक्सेस इटरेटर की आवश्यकताओं को पूरा करते हैं, तो last से पहुंच योग्य होगा first या first last से पहुंच योग्य होगा; अन्यथा, last first से पहुंच योग्य होगा।

अब मुझे लगता है कि आवश्यक है कि को पूरा नहीं है।

क्या मानक राज्य इस मामले में होना चाहिए है?

+0

यदि इसे मानक द्वारा अनुमत नहीं किया जाता है, तो यह संभवतः अपरिभाषित व्यवहार में परिणाम देगा, क्योंकि यह विभिन्न वैक्टरों के पुनरावृत्तियों की तुलना करने के लिए अनौपचारिक है – Creris

+2

सामान्य रूप से, आवश्यकता को तोड़ना अपरिभाषित व्यवहार देता है। –

उत्तर

28

[iterator.requirements.general]:

एक इटरेटर jपहुंच योग्य पुनरावर्तक i तभी अगर वहाँ अभिव्यक्ति ++i कि i == j बनाता है के आवेदनों की एक परिमित अनुक्रम है से कहा जाता है ।

समस्या यह है कि एक बार आप v1.begin()v1.size()-1 बार वृद्धि की जाती, अगले वेतन वृद्धि आपरेशन अपरिभाषित व्यवहार को प्रेरित करता है, इसलिए v2.begin()v1.begin() से नहीं पहुँचा जा सकता। एक ही तर्क v1.begin()v2.begin() से पहुंच योग्य नहीं बनाता है।


यदि आपका प्रश्न था, "अगर एक में एक शर्त आवश्यक है खंड उल्लंघन किया जाता है तो क्या होगा?", [Res.on.required] को देखो:

पूर्व शर्त निर्दिष्ट का उल्लंघन में एक समारोह के आवश्यक है: अपरिभाषित व्यवहार में पैरा परिणाम जब तक समारोह के फेंकता: पैरा निर्दिष्ट एक अपवाद फेंक जब पूर्व शर्त का उल्लंघन है घ।

3

requires पूरा नहीं होता है, जिसका अर्थ है कोड व्यवहार अपरिभाषित है: कुछ भी हो सकता है।

3

इस मामले में अपरिभाषित व्यवहार किया जाएगा। क्योंकि lastfirst से (संभवतः बार-बार) first बढ़ने तक पहुंच योग्य नहीं है।

5

std::distance के कुछ कार्यान्वयन में, पहला पुनरावर्तक तब तक बढ़ता है जब तक यह दूसरे पुनरावर्तक तक नहीं पहुंच जाता। पुनरावृत्तियों गिने जाते हैं:

unsigned int counts = 0; 
while (iter1 != iter2) 
{ 
    ++counts; 
    ++iter1; 
} 

iterators अलग पते के रिक्त स्थान में कंटेनरों को इंगित करते हैं, तो पाश कई समाप्त नहीं। मानक में शर्तों का उपयोग करते हुए, दूसरा इटरेटर पहुंच योग्य नहीं है।

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