मैं शायद असंभव हासिल करने की कोशिश कर रहा हूं, लेकिन स्टैक एक्सचेंज हमेशा मुझे आश्चर्यचकित करता है, इसलिए कृपया इस पर जाएं:क्या संकलन-समय की जांच की गई स्ट्रिंग-टू-इंट नक्शा संभव है?
मुझे एक पूर्णांक में एक नाम मैप करने की आवश्यकता है। नाम (लगभग 2k) अद्वितीय हैं। उस सूची में कोई जोड़ नहीं होगा और न ही हटाएगा और रनटाइम के दौरान मूल्य नहीं बदले जाएंगे।
उन्हें const int
चर के रूप में लागू करने से मुझे अस्तित्व और प्रकार के लिए संकलन-समय की जांच मिलती है। यह भी कोड में बहुत स्पष्ट और verbose है। त्रुटियों को आसानी से देखा जाता है।
उन्हें std::map<std::string, int>
के रूप में लागू करने से मुझे स्ट्रिंग मैनिपुलेशन के साथ नाम बनाने के लिए बहुत लचीलापन मिलता है। मैं स्ट्रिंग को उन कार्यों के पैरामीटर के रूप में देने के लिए उपयोग कर सकता हूं जो उस स्ट्रिंग में प्री-/ प्रत्यय जोड़कर कई मानों के लिए सूची से पूछताछ कर सकते हैं। मैं लूप वैरिएबल से कुंजी नाम का अंक भाग बनाकर कई मानों पर भी लूप कर सकता हूं।
अब मेरा प्रश्न है: क्या दोनों फायदे गठबंधन करने का कोई तरीका है? लापता संकलन-समय की जांच (विशेष रूप से कुंजी-अस्तित्व के लिए) लगभग मेरे लिए दूसरी विधि को मार देती है। (विशेष रूप से std::map
चुपचाप 0
लौटाता है यदि कुंजी मौजूद नहीं है जो बग खोजने में कठोर बनाता है।) लेकिन लूपिंग और प्री-/ प्रत्यय जोड़ने की क्षमताओं बहुत उपयोगी हैं।
मैं ऐसे समाधान को पसंद करूंगा जो बढ़ावा देने जैसी किसी भी अतिरिक्त पुस्तकालय का उपयोग नहीं करता है, लेकिन कृपया उन्हें सुझाव दें, फिर भी मैं उन्हें फिर से लागू करने में सक्षम हूं।
मैं क्या नक्शे के साथ करते हैं पर एक उदाहरण:
void init(std::map<std::string, int> &labels)
{
labels.insert(std::make_pair("Bob1" , 45));
labels.insert(std::make_pair("Bob2" , 8758));
labels.insert(std::make_pair("Bob3" , 436));
labels.insert(std::make_pair("Alice_first" , 9224));
labels.insert(std::make_pair("Alice_last" , 3510));
}
int main()
{
std::map<std::string, int> labels;
init(labels);
for (int i=1; i<=3; i++)
{
std::stringstream key;
key << "Bob" << i;
doSomething(labels[key.str()]);
}
checkName("Alice");
}
void checkName(std::string name)
{
std::stringstream key1,key2;
key1 << name << "_first";
key2 << name << "_last";
doFirstToLast(labels[key1.str()], labels[key2.str()]);
}
एक और लक्ष्य है कि कोड के लिए आसान और संभव के रूप में के रूप में वर्बोज़ main()
नियमित रहता है में दिखाया गया है। (गैर-प्रोग्रामर द्वारा समझा जाने की आवश्यकता है।) init()
फ़ंक्शन कुछ टूल द्वारा कोड-जेनरेट किया जाएगा। doSomething(int)
फ़ंक्शंस फ़िक्स्ड हैं, लेकिन मैं उनके चारों ओर रैपर फ़ंक्शन लिख सकता हूं। checkName()
जैसे हेल्पर्स अधिक जटिल हो सकते हैं, लेकिन आसानी से डिबग करने योग्य होने की आवश्यकता है।
ऐसा लगता है कि आप क्रम में श्रृंखला बनाते हैं चाहते हैं, लेकिन किसी भी तरह इस संकलन समय पर जाँच की है? –
enums को उनके उचित तारों में परिवर्तित करने के तरीके हैं, इसलिए यह संभव होना चाहिए .. हालांकि यह देखने में कठिनाई होती है कि यदि आप रन टाइम में स्ट्रिंग्स बना रहे हैं तो यह संकलित समय कैसा है –
'std :: map' निश्चित रूप से बताने की क्षमता है आप एक तत्व डाला गया था या नहीं। एक तरीका 'डालने' है। – chris