2016-05-04 24 views
5

std::vector::begin() पूर्व-C++11 से std::vector::data() के बराबर सी ++ 11 में है? कारण मैं यह पूछ रहा हूं, सी ++ 11 से पहले, मैं std :: vector :: start() को पॉइंटर के रूप में उपयोग करता था लेकिन सी ++ 11 के बाद, यह नहीं है, और मैं पॉइंटर समकक्ष नहीं डाल सकता । तो, क्या मैं सी ++ 11 के बाद डेटा() का उपयोग कर सकता हूं?क्या सीडी + वेक्टर में प्रारंभिक ++ 11 से std :: vector :: डेटा() के बराबर std :: vector :: start() है?

+4

std :: vector :: start() कभी भी सूचक नहीं था। –

+2

यदि आप एक सूचक के रूप में 'std :: vector :: start()' का इलाज करते थे, तो आप 'std :: vector :: iterator के पॉइंटर्स के रूप में एक विशेष कार्यान्वयन के प्रतिनिधित्व पर निर्भर थे। इस तरह से कभी गारंटी नहीं दी गई थी। – molbdnilo

+0

क्या वे वेक्टर डेटा में पॉइंटर प्राप्त करने के लिए '& (* std :: vector :: start()) 'का उपयोग कर रहे हैं? – NathanOliver

उत्तर

8

नहीं, begin एक पुनरावर्तक देता है, जबकि data एक सूचक देता है। दिए गए कार्यान्वयन के लिए, ये वही बात हो सकती है, लेकिन आपको इस पर भरोसा नहीं करना चाहिए।

+0

इसके अलावा, 'std :: vector' की स्मृति को C++ 11 से पहले संगत होने की गारंटी नहीं थी - हालांकि अभ्यास में एक कार्यान्वयन जो अन्यथा शायद थोड़ा मूर्खतापूर्ण होगा। – alcedine

+7

@alcedine वास्तव में सी ++ 03 में संशोधित किया गया था। यह केवल सी ++ 98 था और इससे पहले इसकी गारंटी नहीं थी। – NathanOliver

+2

@alcedine, सच नहीं है। कम से कम 2003 से contiguos था, और मेरे पास एक बहुत मजबूत भावना है कि यह 98 में contiguos था। – SergeyA

3

इटरेटर को पॉइंटर के रूप में उपयोग करना पूरी तरह से गलत है, क्योंकि यह कार्यान्वयन-परिभाषित है। आप इस तरह dereferenced इटरेटर के पते का उपयोग करना चाहिए यदि आप अभी भी इटरेटर पर आंकड़ों के सूचक की जरूरत है,:

std::vector<int> v; v.push_back(42); 
std::vector<int>::iterator it = v.begin(); 
int * p = &*it; 

और निश्चित रूप से, C++ 11 आप वेक्टर तत्वों के सूचक के रूप में .data() उपयोग कर सकते हैं।

2

क्या सी ++ 11 में std :: vector :: डेटा() के बराबर पूर्व-सी ++ 11 से std :: vector :: प्रारंभ() है?

निर्भर करता है कि आप बराबर के आधार पर क्या मतलब है। डीरफ्रेंसिंग या तो वेक्टर में पहले आइटम का संदर्भ प्रदान करेगी, लेकिन प्रारंभ() द्वारा लौटाए गए इटरेटर को डेटा() द्वारा लौटाए गए सूचक प्रकार में परिवर्तनीय होने की गारंटी नहीं है।

कारण मैं सी ++ 11 से पहले पूछ रहा हूं, मैं एक सूचक के रूप में std :: vector :: start() का इलाज करता था लेकिन सी ++ 11 के बाद, यह नहीं है, और मैं नहीं कर सकता एक सूचक के बराबर कास्ट करें।

आपका कोड अच्छा (या बुरा) भाग्य के माध्यम से काम करता है, इस पर निर्भर करता है कि आप इसे कैसे देखते हैं।

तो, क्या मैं सी ++ 11 के बाद डेटा() का उपयोग कर सकता हूं?

दो इटरेटर जोड़े कि वेक्टर के डेटा में फैल गए हैं:

begin()end()

और

data() करने के लिए data() + size()

आप या तो किसी भी मानक एल्गोरिथ्म और में उपयोग कर सकते हैं नतीजा वही होगा।

अच्छी शैली के मामले में आपको begin()end() पर उपयोग करना चाहिए जहां आप कर सकते हैं (जो लगभग हमेशा होगा)।