2009-05-07 10 views
26

मैं एक सी ++ एप्लिकेशन लिख रहा हूं और मैं सोच रहा था कि सी ++ स्मृति में बाइट सरणी को संग्रहीत करने का पारंपरिक तरीका क्या है।सी ++ एसटीएल की स्ट्रिंग eqivalent बाइनरी डेटा

क्या स्ट्रिंग की तरह कुछ है, विशेष रूप से बाइनरी डेटा के लिए बनाया गया है।

अभी मैं डेटा स्टोर करने के लिए एक * हस्ताक्षरित चार ** सरणी का उपयोग कर रहा हूं, लेकिन कुछ और एसटीएल/सी ++ बेहतर होगा।

+0

http://stackoverflow.com/questions/441203/proper-way-to-store-binary-data-with-c-stl –

उत्तर

35

मैं std::vector<unsigned char> का उपयोग करता हूं। आपको आवश्यक अधिकांश ऑपरेशंस एसटीएल का उपयोग इटरेटर श्रेणियों के साथ किया जा सकता है। साथ ही, याद रखें कि यदि आपको वास्तव में कच्चे डेटा की आवश्यकता है &v[0] अंतर्निहित सरणी को सूचक देने की गारंटी है।

+3

'v.data()' स्पष्ट होने पर '& v [0]' पर भरोसा करने की आवश्यकता नहीं है। –

+3

@ लिमिटेडऑनमेंट वास्तव में, हालांकि 200 9 में डेटा() '' std :: vector' पर परिभाषित नहीं किया गया था। –

23

आप बाइनरी डेटा के लिए भी std::string का उपयोग कर सकते हैं। std::string में डेटा की लंबाई स्पष्ट रूप से संग्रहीत होती है और नल-टर्मिनेशन द्वारा निर्धारित नहीं होती है, इसलिए std::string में नल-बाइट्स का विशेष अर्थ नहीं है।

std::string अक्सर std::vector<char> से अधिक सुविधाजनक है क्योंकि यह बाइनरी डेटा के साथ काम करने के लिए उपयोगी कई विधियां प्रदान करता है लेकिन vector द्वारा प्रदान नहीं किया जाता है। बाइनरी डेटा को पार्स/बनाने के लिए substr() जैसी चीजें रखने के लिए उपयोगी है, + और std::stringstream के लिए अधिभार आपके निपटारे पर है। वैक्टरों पर <algorithm> से एल्गोरिदम का उपयोग समान प्रभाव प्राप्त करने के लिए किया जा सकता है, लेकिन यह स्ट्रिंग विधियों की तुलना में अधिक बेकार है। यदि आप केवल "पात्रों के अनुक्रम" पर कार्य करते हैं, std::string आपको आमतौर पर इच्छित विधियां देता है, भले ही इन अनुक्रमों में "बाइनरी" डेटा हो।

+5

या std :: vector lothar

+0

का डुप्लिकेट मैं std का भी उपयोग करूंगा :: वेक्टर । – xian

+1

std :: vector का लाभ है कि कोई अपनी सामग्री को/लिखने योग्य/चार सूचक (द्वारा & vec [0]) प्राप्त कर सकता है। दूसरी तरफ, आपको std :: string कार्यान्वयन में कॉपी-ऑन-राइट ऑप्टिमाइज़ेशन सामान्य नहीं मिलता है। – bdonlan

19

आपको std::vector<unsigned char> या std::vector<uint8_t> का उपयोग करना चाहिए (यदि आपके पास आधुनिक stdint.h शीर्षलेख है)। यदि आप निश्चित आकार बफर के साथ काम कर रहे हैं तो unsigned char[] या uint8_t[] का उपयोग करने में कुछ भी गलत नहीं है। जहां std::vector वास्तव में चमकता है जब आपको अक्सर अपने बफर में वृद्धि या संलग्न करने की आवश्यकता होती है। एसटीएल इटरेटर्स के पास पॉइंटर्स के समान अर्थशास्त्र होते हैं, इसलिए एसटीएल एल्गोरिदम std::vector और सादे पुराने सरणी के साथ समान रूप से अच्छी तरह से काम करेंगे।

और जैसा कि सीएडीकर ने बताया, अभिव्यक्ति &v[0] आपको वेक्टर के बफर में अंतर्निहित सूचक देने की गारंटी है (और यह स्मृति के एक संगत ब्लॉक होने की गारंटी है)। यह गारंटी सी ++ मानक में एक परिशिष्ट में जोड़ा गया था।

व्यक्तिगत रूप से, मैं, मनमाने ढंग से बाइट बफ़र्स में हेरफेर करने के बाद से मुझे लगता है कि यह संभावित रूप से भ्रामक है std::string उपयोग करने से बचें चाहते हैं, लेकिन यह अभ्यास का एक अनसुना नहीं है।

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