अस्थायी std::string
उदाहरण से बचने का कोई तरीका नहीं है जो चरित्र डेटा कॉपी करता है। ध्यान दें कि यह लागत बहुत कम है और यदि आपका मानक लाइब्रेरी कार्यान्वयन शॉर्ट स्ट्रिंग अनुकूलन का उपयोग करता है तो गतिशील स्मृति आवंटन नहीं होता है।
हालांकि, यदि आपको लगातार आधार पर सी-स्टाइल स्ट्रिंग को प्रॉक्सी करने की आवश्यकता है, तो भी आप कस्टम समाधान के साथ आ सकते हैं जो इस आवंटन को पास कर देगा।यदि आपको यह वास्तव में करना है तो यह भुगतान कर सकता है और आपके तार छोटे स्ट्रिंग अनुकूलन से लाभ नहीं लेते हैं।
आप केवल स्ट्रिंग कार्यक्षमता (जैसे ही काम और प्रतियां) की एक बहुत छोटे सबसेट की जरूरत है, तो आप एक छोटे से विशेष प्रयोजन स्ट्रिंग वर्ग है कि एक const char *
सूचक और स्मृति जारी करने के लिए एक समारोह संग्रहीत करता है लिख सकते हैं। जैसे std::string
करता चरित्र बफर की एक प्रति का निर्माण नहीं करता
std::map<cheap_string, int> m1;
auto i = m1.find(cheap_string::proxy("foo"));
अस्थायी cheap_string
उदाहरण, फिर भी यह के उदाहरण के भंडारण के लिए सुरक्षित प्रतिलिपि अर्थ विज्ञान को बरकरार रखता है:
class cheap_string
{
public:
typedef void(*Free)(const char*);
private:
const char * myData;
std::size_t mySize;
Free myFree;
public:
// direct member assignments, use with care.
cheap_string (const char * data, std::size_t size, Free free);
// releases using custom deleter (a no-op for proxies).
~cheap_string();
// create real copies (safety first).
cheap_string (const cheap_string&);
cheap_string& operator= (const cheap_string&);
cheap_string (const char * data);
cheap_string (const char * data, std::size_t size)
: myData(new char[size+1]), mySize(size), myFree(&destroy)
{
strcpy(myData, data);
myData[mySize] = '\0';
}
const char * data() const;
const std::size_t size() const;
// whatever string functionality you need.
bool operator< (const cheap_string&) const;
bool operator== (const cheap_string&) const;
// create proxies for existing character buffers.
static const cheap_string proxy (const char * data)
{
return cheap_string(data, strlen(data), &abandon);
}
static const cheap_string proxy (const char * data, std::size_t size)
{
return cheap_string(data, size, &abandon);
}
private:
// deleter for proxies (no-op)
static void abandon (const char * data)
{
// no-op, this is used for proxies, which don't own the data!
}
// deleter for copies (delete[]).
static void destroy (const char * data)
{
delete [] data;
}
};
उसके बाद, आप के रूप में इस वर्ग का उपयोग कर सकते मानक कंटेनरों में cheap_string
।
नोटों: यदि आपके कार्यान्वयन वापसी मान अनुकूलन का उपयोग नहीं करता है, आप इस तरह के एक विशेष अधिभार के साथ एक निर्माता के रूप में proxy
विधि के लिए एक वैकल्पिक वाक्य रचना, ढूंढना चाहेंगे (ए ला std::nothrow
के लिए एक कस्टम proxy_t
प्रकार लेने प्लेसमेंट नया)।
यदि आप मानचित्र की परिभाषा को बदल सकते हैं, तो आप एक कस्टम तुलनित्र का उपयोग कर सकते हैं जो 'char const *' सीधे – Pablo
कहां देता है आपको 'कॉन्स्ट char * 'कहां मिलेगा? – Puppy
@Pablo: लेकिन फिर .. किसी को एक स्मृति जहां उन कुंजियों को इंगित कर रहे हैं का प्रबंधन करने के .. जब तक वे डेटा खंड ... –