परिचय: शाश्वत प्रश्न "std::string को int में"
\n\nनमस्ते, साथी प्रोग्रामर! यदि आपने कभी C++ में कॉन्फ़िग पार्सर लिखा है, उपयोगकर्ता इनपुट संसाधित किया है, या CSV फ़ाइल से संख्याएँ निकाली हैं, तो आप निश्चित रूप से इस कार्य से परिचित होंगे: "एक सामान्य स्ट्रिंग (std::string) को एक पूर्णांक (int) में कैसे बदलें?"। यह कितना आसान लगता है? हालाँकि, Stack Overflow पर देखने पर, आपको हज़ारों वोट और दर्जनों उत्तर विकल्प दिखाई देंगे। क्यों? क्योंकि इस सरल प्रश्न के पीछे सुविधा, सुरक्षा और प्रदर्शन के बीच समझौतों की एक पूरी दुनिया छिपी है।
इस लेख में, हम केवल एक सूखा उत्तर नहीं देंगे। हम रूपांतरण के मुख्य तरीकों के बीच एक वास्तविक प्रतियोगिता आयोजित करेंगे: std::stoi, std::from_chars (C++17), std::stringstream, पुराना अच्छा atoi, और यहाँ तक कि अपना खुद का तरीका भी लिखेंगे। आप जानेंगे कि उच्च-लोड सर्वर के लिए कौन सा तरीका चुनना है, और त्वरित प्रोटोटाइप के लिए कौन सा। चलिए शुरू करते हैं!
विधि 1: क्लासिक — std::stoi (C++11)
\n\nC++11 से शुरू करते हुए, मानक पुस्तकालय में एक सुंदर फ़ंक्शन std::stoi जोड़ा गया। यह सरल, पढ़ने में आसान है और त्रुटियों पर अपवाद फेंकता है। यह दैनिक कार्यों के लिए 90% डेवलपर्स की पसंद है।
#include <iostream>\n#include <string>\n\nint main() {\n std::string number_str = "12345";\n try {\n int value = std::stoi(number_str);\n std::cout << "संख्या: " << value << std::endl;\n } catch (const std::invalid_argument& e) {\n std::cerr << "त्रुटि: स्ट्रिंग में कोई संख्या नहीं है!" << std::endl;\n } catch (const std::out_of_range& e) {\n std::cerr << "त्रुटि: संख्या int की सीमा से बाहर है!" << std::endl;\n }\n return 0;\n}\n\nstd::stoi के फायदे और नुकसान
\n- \n
- फायदे: सरलता, लोकेल समर्थन (अल्पविराम को विभाजक के रूप में पहचानता है), अपवादों के माध्यम से स्वचालित त्रुटि प्रबंधन। \n
- नुकसान: अपवाद महंगे हैं। यदि आप लूप में लाखों संख्याओं को पार्स कर रहे हैं, तो
try-catchकोड को काफी धीमा कर सकता है। \n
विधि 2: हवा से भी तेज़ — std::from_chars (C++17)
\n\nयदि आप एक high-load एप्लिकेशन लिख रहे हैं जहाँ हर नैनोसेकंड मायने रखता है, तो std::from_chars आपका हीरो है। यह फ़ंक्शन मेमोरी आवंटित नहीं करता, अपवाद नहीं फेंकता, और लोकेल पर निर्भर नहीं करता। यह बस वर्णों को संख्या में बदलता है और रुकने के स्थान पर एक पॉइंटर लौटाता है।
#include <iostream>\n#include <charconv>\n#include <string>\n#include <system_error>\n\nint main() {\n std::string number_str = "98765";\n int value = 0;\n auto [ptr, ec] = std::from_chars(number_str.data(), \n number_str.data() + number_str.size(), \n value);\n if (ec == std::errc()) {\n std::cout << "संख्या: " << value << std::endl;\n } else {\n std::cerr << "रूपांतरण त्रुटि!" << std::endl;\n }\n return 0;\n}\n\nfrom_chars प्रदर्शन का राजा क्यों है?
\n- \n
- Zero-overhead: कोई अपवाद नहीं, कोई छिपा हुआ आवंटन नहीं। \n
- लोकेलाइज़ेशन बंद: दशमलव विभाजकों की जाँच करने में समय बर्बाद करने की आवश्यकता नहीं। \n
- स्ट्रिंग का शेष भाग लौटाता है: CSV में कॉलम पार्स करने के लिए आदर्श। \n
बेंचमार्क के अनुसार, from_chars stoi से 2-10 गुना तेज़ हो सकता है, विशेष रूप से छोटी स्ट्रिंग्स पर।
विधि 3: भारी तोपखाना — std::stringstream
\n\nकई शुरुआती प्रोग्रामर रूपांतरण के लिए std::stringstream का उपयोग करते हैं। यह एक शक्तिशाली उपकरण है, लेकिन "स्ट्रिंग को संख्या में" कार्य के लिए, यह रोटी खरीदने के लिए टैंक का उपयोग करने जैसा है।
#include <sstream>\n#include <string>\n#