2010-10-07 12 views
20
std::vector<string> names; 
std::vector<string>::iterator start = names.begin(); 
std::vector<string>::iterator end = names.end(); 
sort (start,end); 
//are my start and end valid at this point? 
//or they do not point to front and tail resp? 
+0

मुझे लगता है कि 'std :: vector :: iterator start' होना चाहिए? –

+1

भले ही यह सच है, आपके बाद आने वाला डेवलपर एक दिन बर्बाद कर देगा, यह साबित करने की कोशिश कर रहा है कि वह कुछ बग के लिए मूल कारण है ... –

+0

@ बेन, धन्यवाद, क्षमा करें कॉपी-पेस्ट बुराई! –

उत्तर

18

सी ++ स्टैंडर्ड § 23.1/11 के अनुसार:

अन्यथा जब तक निर्दिष्ट (या तो स्पष्ट या अन्य कार्यों के मामले में एक समारोह को परिभाषित करते हुए), लागू एक कंटेनर सदस्य समारोह या एक कंटेनर गुजर पर एक तर्क के रूप में एक लाइब्रेरी फ़ंक्शन iterators को उस कंटेनर के भीतर ऑब्जेक्ट्स के मानों को बदलने या बदलने के लिए अमान्य नहीं होगा।

§ 25,3 "छंटाई और संबंधित संचालन", निर्दिष्ट नहीं करता कि iterators अवैध कर दिया जाएगा ताकि प्रश्न में iterators वैध रहना चाहिए।

11

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

1

std::vector अपने तत्वों को संगत स्मृति में रखता है। std::sort मूल्य के आधार पर तर्क (iterators) लेता है और उनके बीच अनुक्रम पुन: व्यवस्थित करता है। शुद्ध परिणाम आपके स्थानीय चर start और end अभी भी वेक्टर के पहले और एक-पिछले-अंतिम तत्वों को इंगित कर रहे हैं।

6

std::sort इटरेटर को वेक्टर में अमान्य नहीं करेगा। सॉर्ट टेम्पलेट वेक्टर की सामग्री तक पहुंचने और संशोधित करने के लिए इटरेटर पर * ऑपरेटर का उपयोग करता है, और वेक्टर तत्व को संशोधित करता है, हालांकि वेक्टर में पहले से मौजूद तत्व के लिए इटरेटर किसी भी इटरेटर को अमान्य नहीं करेगा।

सारांश में,

  • अपने मौजूदा iterators
  • लेकिन अवैध नहीं किया जाएगा, तत्वों वे द्वारा प्रदान की मानक के लिए समर्थन करने के लिए

संशोधित हो गया है के अलावा बात किरिल वी Lyadvinsky (Does a vector sort invalidate iterators?):

  • 25/5 "Algorit कि के प्रकार एचएमएस पुस्तकालय "

एक एल्गोरिथ्म के प्रभाव अनुभाग का कहना है हैं कि एक मूल्य के किसी भी इटरेटर एक तर्क के रूप में पारित द्वारा की ओर इशारा किया संशोधित किया गया है, तो है कि एल्गोरिथ्म एक अतिरिक्त प्रकार की आवश्यकता है तर्क एक म्यूटेबल इटरेटर (24.1) की आवश्यकताओं को पूरा करेगा।

  • 24।1/4 "इटरेटर आवश्यकताओं"

अपनी श्रेणी इसके अलावा, एक आगे, द्विदिश, या रैंडम एक्सेस इटरेटर भी परिवर्तनशील या पर कि क्या अभिव्यक्ति की परिणाम * मैं के रूप में व्यवहार के आधार निरंतर किया जा सकता है एक संदर्भ या निरंतर के संदर्भ के रूप में।

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