2013-02-09 20 views
13

This question मुझे खुद को एक वेक्टर जोड़ने के बारे में अनिश्चित बना दिया। तो सवाल यह है कि कोड की निम्नलिखित पंक्तियां मैं अपेक्षा करता हूं, लेकिन क्या यह मानक अनुरूप है?std :: vector को स्वयं में अपरिभाषित व्यवहार में जोड़ना?

vec.reserve(vec.size() * 2): 
vec.insert(vec.end(), vec.begin(), vec.end()); 

(reserve() के बिना) अभी भी काम करता है, तो यह और भी मानक के अनुरूप है के बाद?

vec.insert(vec.end(), vec.begin(), vec.end()); 

या कार्यान्वयन के आधार पर?

+0

(जैसे 'std :: vector' के रूप में) है, जबकि इसके माध्यम से पुनरावृत्ति यूबी –

+0

है अनुरूप रास्ते के लिए, देखें http://stackoverflow.com/q/17636690/103167 –

उत्तर

15

सी ++ 03 आईएसओ कल्पना (§ 23.1.1, टेबल 67) के अनुसार (और @AndyProwl रूप § 23.2.3, टेबल सी ++ 11 आईएसओ कल्पना के 11 में उल्लेख किया गया है,), भाग के रूप में

i, ja में iterators नहीं हैं: अनुक्रम आवश्यकताओं की, एक दृश्य कंटेनर में ऑपरेशन a.insert(p, i, j) इस पूर्व शर्त है।

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

परिणामस्वरूप, यदि आप कंटेनर के तत्वों को अपने आप में डालने का प्रयास करते हैं, तो आप एक मानक लाइब्रेरी फ़ंक्शन को कॉल कर रहे हैं और पूर्व शर्त को तोड़ रहे हैं। इसका परिणाम अपरिभाषित व्यवहार में होता है, जिसका अर्थ यह है कि कुछ प्लेटफ़ॉर्म पर काम कर सकता है यदि लाइब्रेरी कार्यान्वयनकर्ता अच्छे लोग हैं, लेकिन यह कोई औचित्य के साथ बहुत ही विनाशकारी और विनाशकारी रूप से विफल हो सकता है।

आशा है कि इससे मदद मिलती है!

+1

+1, अच्छा एक कंटेनर की सामग्री को बदलने संदर्भ। इसके अलावा, सी ++ 11 में यह तालिका 100 है, § 23.2.3 –

+0

@ एंडीप्रोएल- धन्यवाद! जिज्ञासा से बाहर, क्या आईएसओ स्पेक की कानूनी प्रति प्राप्त करने का कोई आसान तरीका है? – templatetypedef

+0

@templatedtypdef: हाँ, लेकिन आपको इसके लिए भुगतान करना होगा। या आप [यहां] http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2012/n3485.pdf से मुक्त ड्राफ्ट प्राप्त कर सकते हैं)। –

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