दिलचस्प पोस्ट
जावा रेगेक्स ईमेल सी # 2.0 वेबक्लेन्ट के साथ प्रमाण पत्र त्रुटि की अनदेखी कैसे करें – प्रमाणपत्र के बिना डेटाबेस कब और क्यों महंगे हो? React.js: एक ऑन चार्ज हैंडलर के साथ विभिन्न इनपुट की पहचान करना काम करने के लिए "मार्जिन: 0 ऑटो;" के लिए, वास्तव में क्या आवश्यक है? सी अभिव्यक्ति में जहां अहस्ताक्षरित int और हस्ताक्षरित इंट मौजूद है, किस प्रकार को किस प्रकार को बढ़ावा दिया जाएगा? एसिंक्रोनस (एजेएएसीए) फ़ाइल को आइफ्रेम का उपयोग करने के लिए कैसे करें? जांचने का बेहतर तरीका है कि क्या पथ फ़ाइल या निर्देशिका है? MySQL में टेबल वैरिएबल बनाएँ पायथन: defaultdict का डिफ़ॉल्ट दिशानिर्देश? to_char के साथ प्रारूप अंतराल PHP में लिखा कोई सभ्य PHP पार्सर? सी ++ में परमाणु के एक वेक्टर को कैसे घोषित करना Google स्प्रैडशीट से सही समय मान कैसे पढ़ें INSERT पर SQL इंजेक्शन

एक std :: string ऑब्जेक्ट के लिए स्मृति को पूर्व आवंटित कैसे करें?

मुझे एक स्ट्रिंग में एक फ़ाइल कॉपी करने की आवश्यकता है। मुझे उस स्ट्रिंग ऑब्जेक्ट के लिए मेमोरील को प्रीलॉक करने के लिए और सीधे उस स्ट्रिंग की मेमोरी में फाइल की सामग्री को पढ़ने का एक तरीका चाहिए?

वेब के समाधान से एकत्रित समाधान "एक std :: string ऑब्जेक्ट के लिए स्मृति को पूर्व आवंटित कैसे करें?"

std::string भी एक .reserve विधि है

यह अपने आप में बहुत ज्यादा एक जवाब नहीं है, जैसा कि एक अन्य तरह के उत्तर / सारांश / तुलना पर एक टिप्पणी के रूप में और साथ ही एक त्वरित प्रदर्शन का सुझाव दिया है कि मैंने कोड की शैली को क्यों सुझाया है – जोहेन्स – लिटब देता है अपने जवाब में) चूंकि @ एसबीआई ने एक विकल्प पोस्ट किया जो एकदम अच्छा लग रहा था, और (विशेषकर) स्ट्रिंग स्ट्रीम में पढ़ने की अतिरिक्त कॉपी से बचा जाता था, फिर। .str() सदस्य सदस्य को स्ट्रिंग पाने के लिए इस्तेमाल करने के बाद, मैंने दो लोगों की त्वरित तुलना लिखने का फैसला किया :

[संपादित करें: मैंने टाइटलर मैकहेनरी के istreambuf_iterator आधारित कोड का उपयोग करते हुए एक तीसरा टेस्ट केस जोड़ लिया है, और प्रत्येक स्ट्रिंग की लंबाई को प्रिंट करने के लिए एक पंक्ति जोड़ दी है जिससे यह सुनिश्चित किया गया कि अनुकूलक ने पढ़ना दूर नहीं किया है क्योंकि परिणाम कभी इस्तेमाल नहीं किया गया था।]

[संपादित करें 2: और अब, मार्टिन यॉर्क से कोड भी जोड़ दिया गया है …]

 #include <fstream> #include <sstream> #include <string> #include <iostream> #include <iterator> #include <time.h> int main() { std::ostringstream os; std::ifstream file("equivs2.txt"); clock_t start1 = clock(); os << file.rdbuf(); std::string s = os.str(); clock_t stop1 = clock(); std::cout << "\ns.length() = " << s.length(); std::string s2; clock_t start2 = clock(); file.seekg( 0, std::ios_base::end ); const std::streampos pos = file.tellg(); file.seekg(0, std::ios_base::beg); if( pos!=std::streampos(-1) ) s2.reserve(static_cast<std::string::size_type>(pos)); s2.assign(std::istream_iterator<char>(file), std::istream_iterator<char>()); clock_t stop2 = clock(); std::cout << "\ns2.length = " << s2.length(); file.clear(); std::string s3; clock_t start3 = clock(); file.seekg(0, std::ios::end); s3.reserve(file.tellg()); file.seekg(0, std::ios::beg); s3.assign((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>()); clock_t stop3 = clock(); std::cout << "\ns3.length = " << s3.length(); // New Test std::string s4; clock_t start4 = clock(); file.seekg(0, std::ios::end); s4.resize(file.tellg()); file.seekg(0, std::ios::beg); file.read(&s4[0], s4.length()); clock_t stop4 = clock(); std::cout << "\ns4.length = " << s3.length(); std::cout << "\nTime using rdbuf: " << stop1 - start1; std::cout << "\nTime using istream_iterator: " << stop2- start2; std::cout << "\nTime using istreambuf_iterator: " << stop3 - start3; std::cout << "\nTime using read: " << stop4 - start4; return 0; } 

अब प्रभावशाली हिस्सा – परिणाम सबसे पहले वीसी ++ (अगर किसी को परवाह है, तो मार्टिन का कोड तेजी से पर्याप्त है, इसके लिए मैंने सार्थक समय के लिए फाइल का आकार बढ़ाया है):

s.length () = 7669436
s2.length = 6390688
s3.length = 7669436
s4.length = 7669436
Rdbuf का उपयोग करने का समय: 184
समय आइटीरिमाइटरेटर का उपयोग कर: 1332
समय आइएसटीएमबीआईआईटीएटर का उपयोग कर: 24 9
पढ़ने का उपयोग करते समय: 48

फिर जीसीसी (साइगविन) के साथ:

s.length () = 8278035
s2.length = 639068 9
s3.length = 8278035
s4.length = 8278035
Rdbuf का उपयोग करने का समय: 62
आईएसटीआईआईटरएटर का उपयोग करने का समय: 21 99
आईएसटीएमबीआईएमएटरएटर का उपयोग करने का समय: 156
पढ़ने का समय: 16

[संपादित करने का अंत – निष्कर्ष रहते हैं, हालांकि विजेता बदल गया है – मार्टिन का कोड स्पष्ट रूप से सबसे तेज है ]

परिणाम, जो सबसे तेज़ और धीमे है, के संबंध में काफी संगत हैं। केवल विसंगति यह है कि कितना तेज़ या धीमा एक दूसरे की तुलना में है हालांकि प्लेसमेंट समान हैं, लेकिन वीसी ++ के मुकाबले गति अंतर काफी जीसीसी के साथ बहुत अधिक है।

यह आपको सभी की ज़रूरत होनी चाहिए:

 ostringstream os; ifstream file("name.txt"); os << file.rdbuf(); string s = os.str(); 

यह file से वर्ण पढ़ता है और उन्हें स्ट्रिंग स्ट्रीम में सम्मिलित करता है। बाद में यह दृश्यों के पीछे बनाई स्ट्रिंग हो जाता है। सूचना है कि मैं निम्नलिखित जाल में गिर गया: निष्कर्षण ऑपरेटर का उपयोग प्रारंभिक श्वेतस्थान को छोड़ देगा। आपको ऊपर की तरह प्रविष्टि ऑपरेटर का उपयोग करना होगा, या noskipws मैनिपुलेटर का उपयोग करना noskipws :

 // Beware, skips initial whitespace! file >> os.rdbuf(); // This does not skip it file >> noskipws >> os.rdbuf(); 

इन फ़ंक्शंस को वर्ण चरित्र के रूप में पढ़ने के रूप में वर्णित किया गया है (यद्यपि यह सुनिश्चित नहीं है कि अनुकूलन यहां संभव क्यों हैं), मैंने अपनी गति निर्धारित करने के लिए इन्हें समय नहीं दिया है

मस्ती के लिए, यहां यह एक और तरीका है:

 // Beware, brain-compiled code ahead! std::ifstream ifs( /* ... */ ); if( !ifs.good() ) return; // whatever std::string str; ifs.seekg( 0, std::ios_base::end ); const std::streampos pos = ifs.tellg(); ifs.seekg( 0, std::ios_base::beg ); if( pos!=std::streampos(-1) ) // can get stream size? str.reserve(static_cast<std::string::size_type>(pos)); str.assign( std::istream_iterator<char>(ifs) , std::istream_iterator<char>() ); 

मुझे आशा है कि मैंने इसे बहुत बुरी तरह से उड़ाया नहीं।

std :: स्ट्रिंग :: रिजर्व ()

std :: getline ()

ऐसा लगता है कि आप पूछ रहे हैं कि कैसे एक CString :: GetBuffer, स्टड :: स्ट्रिंग के साथ रिलीजबफ़र टाइप ऑपरेशन करना है।

मैं इसे सीधे करने के लिए किसी भी तरह से नहीं जानता, एक आसान तरीका सिर्फ एक कच्चा सी शैली बफर बनाने के लिए, बफर में पढ़ा होगा, फिर बफर को एक std :: स्ट्रिंग का उपयोग करके आवंटित या जो भी हो बफर आपको बफर ओवररन मुद्दों आदि के बारे में चिंता करना होगा, मैं कच्चे बफ़र पॉइंटर का प्रबंधन करने के लिए, स्टड :: ऑटोपट्रिक का उपयोग अपवाद आदि पर डीओलोकेशन को प्रोत्साहित करने के लिए करना होगा। यह स्ट्रिंगस्ट्रीम इत्यादि की तुलना में थोड़ा सा सरल है I यदि आवश्यक हो तो एक उदाहरण

डेविन एलिंगसन