std::vector::begin()
पूर्व-C++11
से std::vector::data()
के बराबर सी ++ 11 में है? कारण मैं यह पूछ रहा हूं, सी ++ 11 से पहले, मैं std :: vector :: start() को पॉइंटर के रूप में उपयोग करता था लेकिन सी ++ 11 के बाद, यह नहीं है, और मैं पॉइंटर समकक्ष नहीं डाल सकता । तो, क्या मैं सी ++ 11 के बाद डेटा() का उपयोग कर सकता हूं?क्या सीडी + वेक्टर में प्रारंभिक ++ 11 से std :: vector :: डेटा() के बराबर std :: vector :: start() है?
उत्तर
नहीं, begin
एक पुनरावर्तक देता है, जबकि data
एक सूचक देता है। दिए गए कार्यान्वयन के लिए, ये वही बात हो सकती है, लेकिन आपको इस पर भरोसा नहीं करना चाहिए।
इसके अलावा, 'std :: vector' की स्मृति को C++ 11 से पहले संगत होने की गारंटी नहीं थी - हालांकि अभ्यास में एक कार्यान्वयन जो अन्यथा शायद थोड़ा मूर्खतापूर्ण होगा। – alcedine
@alcedine वास्तव में सी ++ 03 में संशोधित किया गया था। यह केवल सी ++ 98 था और इससे पहले इसकी गारंटी नहीं थी। – NathanOliver
@alcedine, सच नहीं है। कम से कम 2003 से contiguos था, और मेरे पास एक बहुत मजबूत भावना है कि यह 98 में contiguos था। – SergeyA
इटरेटर को पॉइंटर के रूप में उपयोग करना पूरी तरह से गलत है, क्योंकि यह कार्यान्वयन-परिभाषित है। आप इस तरह dereferenced इटरेटर के पते का उपयोग करना चाहिए यदि आप अभी भी इटरेटर पर आंकड़ों के सूचक की जरूरत है,:
std::vector<int> v; v.push_back(42);
std::vector<int>::iterator it = v.begin();
int * p = &*it;
और निश्चित रूप से, C++ 11 आप वेक्टर तत्वों के सूचक के रूप में .data()
उपयोग कर सकते हैं।
क्या सी ++ 11 में std :: vector :: डेटा() के बराबर पूर्व-सी ++ 11 से std :: vector :: प्रारंभ() है?
निर्भर करता है कि आप बराबर के आधार पर क्या मतलब है। डीरफ्रेंसिंग या तो वेक्टर में पहले आइटम का संदर्भ प्रदान करेगी, लेकिन प्रारंभ() द्वारा लौटाए गए इटरेटर को डेटा() द्वारा लौटाए गए सूचक प्रकार में परिवर्तनीय होने की गारंटी नहीं है।
कारण मैं सी ++ 11 से पहले पूछ रहा हूं, मैं एक सूचक के रूप में std :: vector :: start() का इलाज करता था लेकिन सी ++ 11 के बाद, यह नहीं है, और मैं नहीं कर सकता एक सूचक के बराबर कास्ट करें।
आपका कोड अच्छा (या बुरा) भाग्य के माध्यम से काम करता है, इस पर निर्भर करता है कि आप इसे कैसे देखते हैं।
तो, क्या मैं सी ++ 11 के बाद डेटा() का उपयोग कर सकता हूं?
दो इटरेटर जोड़े कि वेक्टर के डेटा में फैल गए हैं:
begin()
end()
और
data()
करने के लिए data() + size()
आप या तो किसी भी मानक एल्गोरिथ्म और में उपयोग कर सकते हैं नतीजा वही होगा।
अच्छी शैली के मामले में आपको begin()
end()
पर उपयोग करना चाहिए जहां आप कर सकते हैं (जो लगभग हमेशा होगा)।
- 1. std :: vector
- 2. std :: vector
- 3. std :: vector
- 4. std :: vector
- 5. std :: vector
- 6. std :: vector से दूसरे
- 7. std :: vector
- 8. std :: vector
- 9. std :: vector को सरणी
- 10. std :: vector
- 11. std :: vector और std :: list
- 12. std :: vector :: QVector
- 13. std :: vector से std :: stack C++
- 14. क्या std :: vector :: डेटा() चलकर संरक्षित है?
- 15. सी ++: std :: vector
- 16. क्या std :: vector अपना पता बदलता है?
- 17. std :: vector :: ऑपरेटर [] std :: vector :: at() से 5 से 10 गुना तेज क्यों है?
- 18. std :: array को std :: vector
- 19. std :: wctor को std :: vector
- 20. एक std :: vector
- 21. std :: start और std :: end
- 22. सी ++ 11: std :: vector :: shrink_to_fit जटिलता
- 23. एक std :: vector को std :: valarray
- 24. सीवी :: मैट से std :: vector
- 25. std :: vector <std::pair>
- 26. `std :: vector <std :: uint8_t>`
- 27. सी ++ एक std :: vector या std :: deque
- 28. यह std :: vector जैसे सरणी
- 29. क्या std :: vector :: clear() std :: vector :: क्षमता() को शून्य पर कॉल करेगा?
- 30. क्या std :: vector या boost :: वेक्टर थ्रेड सुरक्षित है?
std :: vector :: start() कभी भी सूचक नहीं था। –
यदि आप एक सूचक के रूप में 'std :: vector :: start()' का इलाज करते थे, तो आप 'std :: vector :: iterator के पॉइंटर्स के रूप में एक विशेष कार्यान्वयन के प्रतिनिधित्व पर निर्भर थे। इस तरह से कभी गारंटी नहीं दी गई थी। – molbdnilo
क्या वे वेक्टर डेटा में पॉइंटर प्राप्त करने के लिए '& (* std :: vector :: start()) 'का उपयोग कर रहे हैं? – NathanOliver