C++ में स्ट्रिंग के शब्दों पर पुनरावृत्ति: शुरुआत से पेशेवर तक 5 तरीके

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

स्ट्रिंग को परमाणुओं में तोड़ना: C++ में शब्दों पर कैसे चलें (और दिमाग न खराब करें)

\n\n

कल्पना करें: आप एक लॉग विश्लेषक, कमांड पार्सर लिख रहे हैं या बस एक वाक्य में शब्दों की गणना करना चाहते हैं। सबसे पहले जो दिमाग में आता है — एक स्ट्रिंग लेना और प्रत्येक शब्द पर अलग-अलग चलना। Python में यह एक पंक्ति में होता है: "hello world".split()। लेकिन हम C++ में हैं, इसलिए सरलता एक विलासिता है जिसे अर्जित करना होता है।

\n\n

प्रश्न "How do I iterate over the words of a string?" ने Stack Overflow पर सैकड़ों हज़ारों व्यूज़ जुटाए हैं। और यह आकस्मिक नहीं है: शुरुआती मेमोरी प्रबंधन की बारीकियों में डूब जाते हैं, और पेशेवर गति और पठनीयता के बीच संतुलन तलाशते हैं। इस लेख में हम C++ में शब्दों पर पुनरावृत्ति के 5 तरीकों का विश्लेषण करेंगे, उनके प्रदर्शन की तुलना करेंगे और समझेंगे कि कब किसका उपयोग करना है।

\n\n

यदि आपने कभी strtok लिखा है और segfault मिला है, या std::regex को हॉट लूप में डालने का प्रयास किया है — यह लेख आपके लिए है।

\n\n

तरीका #1: क्लासिक — std::istringstream

\n\n

शुरुआती लोगों के लिए सबसे सुरक्षित और सहज तरीका। std::istringstream एक स्ट्रीम की तरह काम करता है: आप बस इसमें से रिक्त स्थान से अलग किए गए शब्दों को पढ़ते हैं।

\n\n
#include <iostream>\n#include <sstream>\n#include <string>\n#include <vector>\n\nint main() {\n    std::string text = "C++ is not for the faint of heart";\n    std::istringstream stream(text);\n    std::string word;\n    std::vector<std::string> words;\n    \n    while (stream >> word) {\n        words.push_back(word);\n        std::cout << "Word: " << word << std::endl;\n    }\n    \n    std::cout << "Total words: " << words.size() << std::endl;\n    return 0;\n}
\n\n

लाभ: स्वच्छ कोड, कोई रॉ पॉइंटर नहीं, स्वचालित मेमोरी प्रबंधन। किसी भी स्पेस विभाजक (टैब, नई लाइन) के साथ काम करता है।

\n\n

नुकसान: स्ट्रीम बनाने के कारण मैन्युअल तरीकों से धीमा। कस्टम विभाजकों के लिए उपयुक्त नहीं (केवल स्पेस वर्ण)।

\n\n

कब उपयोग करें: जब पठनीयता गति से अधिक महत्वपूर्ण हो। शैक्षिक उदाहरणों और प्रोटोटाइप के लिए आदर्श।

\n\n

तरीका #2: तेज़ और खतरनाक — std::strtok

\n\n

C से विरासत, जो अभी भी प्रोडक्शन में जीवित है। strtok मूल स्ट्रिंग को संशोधित करता है (शून्य वर्ण सम्मिलित करता है) और एक स्थिर बफर का उपयोग करता है।

\n\n
#include <iostream>\n#include <cstring>\n#include <vector>\n\nint main() {\n    char text[] = "Fast but dangerous — handle with care";\n    std::vector<char*> words;\n    \n    char* token = std::strtok(text, " ");\n    while (token != nullptr) {\n        words.push_back(token);\n        std::cout << "Word: " << token << std::endl;\n        token = std::strtok(nullptr, " ");\n    }\n    \n    std::cout << "Total words: " << words.size() << std::endl;\n    return 0;\n}
\n\n

लाभ: बहुत तेज़ (C-स्ट्रिंग स्तर पर काम करता है)। आपको विभाजकों का कोई भी सेट निर्दिष्ट करने की अनुमति देता है।

\n\n

नुकसान: thread-safe नहीं, मूल स्ट्रिंग को नष्ट करता है, केवल char* के साथ काम करता है, std::string के साथ नहीं। आसानी से undefined behavior हो सकता है।

\n\n

कब उपयोग करें: केवल हॉट लूप में, जहां हर नैनोसेकंड मायने रखता है, और आप सिंगल-थ्रेडेड होने के बारे में सुनिश्चित हैं। आधुनिक C++ में इससे बचना बेहतर है।

\n\n

तरीका #3: मैन्युअल पुनरावृत्ति — std::string::find और substr

\n\n

कभी-कभी पूर्ण नियंत्रण की आवश्यकता होती है। मैन्युअल पुनरावृत्ति लचीलापन देती है और अतिरिक्त लाइब्रेरी की आवश्यकता नहीं होती।

\n\n
#include <iostream>\n#include <string>\n#include <vector>\n\nstd::vector<std::string> splitManual(const std::string& text, char delimiter = ' ') {\n    std::vector<std::string> tokens;\n    size_t start = 0;\n    size_t end = text.find(delimiter);\n    \n                

ब्लॉग

पुस्तक अनुशंसाएँ