2016-11-02 5 views
5

मैं इस प्रकार एक संरचना की जरूरत है:कौन सा डेटा संरचना एसटीडी स्ट्रिंग की एक सरणी के लिए बेहतर है

Figure1

संरचना चाहिए निश्चित आकार धारण std::string रों और उसके तत्वों की संख्या finit (100 है - 10000000)।

std::string Temp = MyStrcuture[i]; 

या

MyStrcuture[i] = std::string Temp; 

मुझे कोई साथ सबसे तेजी से संरचना चुनने के लिए (संभवतः) स्मृति रिसाव:

केवल आवश्यकता है जो मैं की जरूरत है इस प्रकार बेतरतीब ढंग से प्रत्येक तत्व उपयोग करने की क्षमता है ।

मेरे लिए कौन सा बेहतर है?

  1. std::string* MyStrcuture = new std::string[Nu_of_Elements];
  2. std::queue< std:string> MyStrcuture(Nu_of_Elements);
  3. std::vector< std:string> MyStrcuture(Nu_of_Elements);
  4. boost::circular_buffer< std::string> MyStrcuture(Nu_of_Elements);
  5. आपके सुझाव?
+0

कतार भी यादृच्छिक रूप से सुलभ है? –

+0

इसके अलावा, क्या सी ++ में हैश टेबल है? यह अच्छा हो सकता है। –

+0

unordered_map सी ++ –

उत्तर

12
std::vector< std:string> MyStrcuture(Nu_of_Elements); 

Vector अपनी आवश्यकताओं के लिए सबसे उपयुक्त है। यह इंडेक्स-आधारित तत्व पहुंच का समर्थन करता है क्योंकि तत्व निरंतर मेमोरी पतों में संग्रहीत होते हैं, और आकार के साथ लचीलापन होता है।


  1. एसटीडी: स्ट्रिंग * MyStrcuture = नए std :: स्ट्रिंग [Nu_of_Elements]; नहीं

    C++ STL vector vs array in the real world

  2. std :: कतार < एसटीडी: स्ट्रिंग> MyStrcuture (Nu_of_Elements); नहीं

    How do I get the nth item in a queue in java?
    सूचकांक आधारित तत्व पहुंच समर्थित नहीं है।

  3. std :: वेक्टर < std: string> MyStrcuture (Nu_of_Elements); हाँ

    Clean-up: वेक्टर नाशक स्वचालित रूप से वेक्टर में प्रत्येक तत्व की नाशक invokes।

  4. बूस्ट :: सर्कुलर_बफर < std :: string> MyStrcuture (Nu_of_Elements); नहीं

    दूसरा कारण जैसा ही कारण है।Know more

+2

'std :: वेक्टर ', 'std :: vector > 'स्मृति परिप्रेक्ष्य से अधिक समझ में आता है। – themagicalyang

+1

@themagicalyang: हाँ और नहीं, क्योंकि इसमें संगत स्मृति का एक विशाल ब्लॉक की आवश्यकता होगी, जो कि उदाहरण में उपलब्ध नहीं हो सकता है एक खंडित 32 बिट पता स्थान। –

+0

@MatteoItalia I concur। लेकिन अगर ऐसा है, तो आवंटन की जांच में कुछ त्रुटि देय है। लेकिन संगत स्मृति स्मृति अभी भी मेरी पहली पसंद होगी। यदि एक अलग आवंटन पैटर्न पर वापस नहीं आते हैं। – themagicalyang

4

खैर, अपने स्ट्रिंग आकार तय कर दी है के बाद से, अगर आप समर्पित आवश्यकता नहीं है जब स्ट्रिंग प्रसंस्करण और सन्निहित आवंटन के लिए पर्याप्त मुक्त स्मृति है। आप std :: array < char, 400> या std :: unique_ptr < char *> std :: स्ट्रिंग के बजाय उपयोग कर सकते हैं।

  1. आपको सी तरीके से मेमोरी प्रबंधित करना है। स्मार्ट सूचक पर विचार
  2. std :: कतार Access c++ queue elements like an array

  3. std :: वेक्टर उपयुक्त है अगर तार का नंबर बदल जाएगा, रैंडम एक्सेस नहीं है। हालांकि, स्पष्ट() फ़ंक्शन केवल तत्वों के विनाशक को कॉल करता है, न कि वेक्टर आवंटित स्मृति (आप स्पष्ट होने के बाद क्षमता की जांच कर सकते हैं)।

  4. boost documentation पढ़ने के बाद। यादृच्छिक अभिगम परिपत्र बफर उपयुक्त है यदि आपकी स्ट्रिंग की संख्या ऊपरी सीमा है (जिसे आपने 10 लाख कहा था)। लेकिन अगर वास्तव में आपके पास बहुत कम तार हैं तो यह स्मृति की बर्बादी है। तो मैं स्मार्ट सूचक के साथ उपयोग करने का सुझाव देता हूं।

  5. यदि आपकी स्ट्रिंग की संख्या प्रारंभ से ही तय और अपरिवर्तित है। तत्वों और लंबाई की संख्या ठीक हो गई है और स्मृति के लिए महत्वपूर्ण है, तो आप C++11 array container

0

पर एक नज़र हो सकता है, आप सादे चार सरणी है, जो कम से कम स्मृति भूमि के ऊपर और तेजी से पहुँच प्रदान करता है उपयोग करने पर विचार कर सकते हैं। आपका कोड इस तरह दिखेगा:

char* MyStructure = new char[n * 401]; 
memset(MyStructure, 0, n * 401); 

std::string Temp = MyStructure[i * 401]; // Get value 
strcpy(MyStructure[i * 401], Temp.c_str()); // Put value 

401 यहां आपकी स्ट्रिंग के 400 बाइट और 1 पिछला शून्य है।

+2

यह उचित समाधान है। तारों को निश्चित रूप से आकार देने के दौरान गतिशील रूप से आवंटित std :: स्ट्रिंग के लिए क्यों जाना होगा और वर्ण सरणी में रखा जा सकता है। इसके लिए अधिक लाभ तेजी से पहुंच है, और कोई मेमोरी होप्स नहीं है। हालांकि मैं इसके बजाय स्ट्रिंग के लिए 'std :: array ' का उपयोग करूंगा। तो यह 'std :: vector ' – themagicalyang

+1

हो सकता है, मुझे यकीन है कि आपका मतलब है * पीछे * शून्य। – celtschk

+0

"1 अग्रणी शून्य"? क्या आपका मतलब शून्य समाप्ति है? –

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