"स्ट्रिंग्स के उपयोग से परहेज" करके, मुझे लगता है कि आप ऐसा कर रहे हैं क्योंकि स्ट्रिंग-केवल प्रतिनिधित्व बहुत अक्षम है यदि आप एक पूर्णांक मान चाहते हैं।
उस अंत में, मैं थोड़ा अपरंपरागत दृष्टिकोण सुझाता हूं जो उपयुक्त हो सकता है। उन्हें एक रूप में स्टोर न करें, उन्हें दोनों में स्टोर करें। नीचे दिया गया कोड सी में है - यह सी ++ में काम करेगा लेकिन आप सी ++ समकक्षों का उपयोग करने पर विचार करना चाहेंगे - इसके पीछे विचार हालांकि नहीं बदलता है।
द्वारा "दोनों रूपों भंडारण", मेरा मतलब है आप की तरह एक संरचना है कर सकते हैं:
typedef struct {
int ival;
char sval[sizeof("-2147483648")]; // enough for 32-bits
int dirtyS;
} tIntStr;
और इस संरचना (या उसके पते) के बजाय पूर्णांक ही चारों ओर गुजरती हैं।
मैक्रो या की तरह इनलाइन कार्यों होने से:
inline void intstrSetI (tIntStr *is, int ival) {
is->ival = i;
is->dirtyS = 1;
}
inline char *intstrGetS (tIntStr *is) {
if (is->dirtyS) {
sprintf (is->sval, "%d", is->ival);
is->dirtyS = 0;
}
return is->sval;
}
फिर, मान सेट करने के लिए, आप का प्रयोग करेंगे:
tIntStr is;
intstrSetI (&is, 42);
और जब भी आप स्ट्रिंग प्रतिनिधित्व चाहता था:
printf ("%s\n" intstrGetS(&is));
fprintf (logFile, "%s\n" intstrGetS(&is));
यह आवश्यक होने पर स्ट्रिंग प्रस्तुति की गणना करने का लाभ है (ऊपरस्ट्रिंग प्रस्तुति और printf
को केवल गंदे होने पर पुन: गणना करने की आवश्यकता नहीं होगी)।
यह एक समान चाल है जिसे मैं एसक्यूएल में प्रीकंप्यूटेड कॉलम और ट्रिगर्स का उपयोग करने के साथ उपयोग करता हूं। विचार यह है कि जब आवश्यक हो तो आप केवल गणना करते हैं। तो अनुक्रमित लोअरकेड अंतिम नाम को एक गणना/अद्यतन ट्रिगर के साथ गणना करने के लिए एक अतिरिक्त कॉलम, आमतौर पर select lower(non_lowercased_last_name)
से बहुत अधिक कुशल है। ऐसा इसलिए है क्योंकि यह सभी पढ़ने में गणना (लिखने के समय पर किया गया) की लागत को कम करता है।
उस अर्थ में, यदि आपकी कोड प्रोफ़ाइल set-int/use-string/set-int/use-string...
है तो इसका थोड़ा सा फायदा होता है। लेकिन, अगर यह set-int/use-string/use-string/use-string/use-string...
है, तो आपको एक प्रदर्शन बढ़ावा मिलेगा।
यह अनुमान लगाया गया है कि कम से कम अतिरिक्त अतिरिक्त संग्रहण आवश्यक है, लेकिन अधिकांश प्रदर्शन समस्याएं अंतरिक्ष/समय व्यापार-बंद तक उबालती हैं।
और, यदि आप वास्तव में स्ट्रिंग से बचना चाहते हैं, तो आप अभी भी उसी विधि का उपयोग कर सकते हैं (केवल आवश्यकता होने पर गणना करें), यह केवल गणना है कि (गणना) संरचना अलग होगी।
एक अलग रूप में के रूप में: आप अच्छी तरह से पुस्तकालय कार्यों का उपयोग करने के अपने खुद के कोड handcrafting के बजाय यह करने के लिए कर सकते हैं। पुस्तकालय कार्यों को आम तौर पर अत्यधिक अनुकूलित किया जाएगा, संभवतः आपके कंपाइलर से आपके कोड से बना सकते हैं (हालांकि यह निश्चित रूप से गारंटी नहीं है)।
यह भी संभावना है कि itoa
, यदि आपके पास कोई है, तो संभवतः sprintf("%d")
से भी अधिक सीमित होगा, इसके सीमित उपयोग मामले को देखते हुए। हालांकि, आपको उपाय करना चाहिए, अनुमान नहीं! पुस्तकालय कार्यों के संदर्भ में नहीं, बल्कि यह संपूर्ण समाधान (और अन्य) भी।
दोहराना div/mod वह सब कुछ है जो आप कर सकते हैं। यहां तक कि sprintf() भी ऐसा करना है। – chrisaycock
ओपी अलगो रिवर्स ऑर्डर में अंक नहीं देगा? – Chubsdad