विषय पर बढ़ें

अंतिम अद्यतन:2026-10-12

STL string गहन विश्लेषण

जब हम C++ का उपयोग करते हैं, तो लाइब्रेरी की मूल बातें काफी परिचित होती हैं, विशेषतः C++ में स्ट्रिंग बनाते समय उपयोग होने वाला std::string। यह निस्संदेह पुरानी C-शैली की “स्ट्रिंग” (शून्य वर्ण से समाप्त होने वाला कैरेक्टर array) पर एक सुधार है। हालाँकि, C++ स्टैंडर्ड लाइब्रेरी ने C++17 और C++20 में अधिक उपयोगी घटक पेश किए हैं जो आपको अधिक कुशल कोड लिखने में सहायता कर सकते हैं।

हेडर फ़ाइल में std::basic_string क्लास एक टेम्प्लेट क्लास है, जो विभिन्न स्ट्रिंग टाइप्स के लिए स्पेशलाइज़ेशन प्रदान करती है, जिनमें सामान्य स्ट्रिंग के लिए std::string (अर्थात् std::basic_string) तथा वाइड स्ट्रिंग के लिए std::wstring (अर्थात् std::basic_string) शामिल हैं।

कुछ निश्चित चौड़ाई वाली विशेष स्ट्रिंग भी हैं, जैसे std::u32string (अर्थात् std::basic_string) और std::u16string (अर्थात् std::basic_string)।

C++20 में char8_t पेश किया गया, जिसके साथ std::u8string (अर्थात् std::basic_string) भी आया। मुझे नहीं पता कि char8_t को C++20 तक क्यों रोका गया — तो एक प्रश्न: char16_t और char32_t किस स्टैंडर्ड में मौजूद हैं? कमेंट अनुभाग में मिलते हैं

C++11

C++11 स्टैंडर्ड के अंतर्गत, स्ट्रिंग प्रोसेसिंग मुख्य रूप से std::string क्लास पर निर्भर करती थी, जो डायनामिक रूप से मेमोरी आवंटित करने वाली स्ट्रिंग क्लास है। इसके अतिरिक्त, नई निश्चित-चौड़ाई वाली स्ट्रिंग टाइप्स जैसे std::u32string और std::u16string पेश की गईं, जिससे Unicode कैरेक्टर्स को संभालने के लिए बेहतर समर्थन मिला।

#include <iostream>
#include <string>

int main() {
    // 使用std::string
    std::string str = "Hello, C++11!";

    // 使用std::u32string和std::u16string
    std::u32string u32str = U"Hello, Unicode!";
    std::u16string u16str = u"Hello, Unicode!";

    std::cout << str << std::endl;
    std::wcout << u32str << std::endl;
    std::wcout << u16str << std::endl;

    return 0;
}

C++17

C++17 में हेडर फ़ाइल पेश की गई, जो हेडर की स्ट्रिंग टाइप्स के लिए एक हल्का केवल-पठनीय विकल्प प्रदान करती है। ये स्ट्रिंग view पहले वर्णित स्ट्रिंग्स के समान हैं। उदाहरण के लिए, std::u32string का समतुल्य std::u32string_view (अर्थात् std::basic_string_view) है।

यह उन फंक्शन्स में विशेष रूप से उपयोगी है जहाँ स्ट्रिंग को पढ़ना हो पर संशोधित न करना हो। फंक्शन के लिए स्ट्रिंग की प्रतिलिपि बनाने के विपरीत, हम केवल मौजूदा स्ट्रिंग को देख सकते हैं! इसके अलावा, बहुत लचीला है — यह न केवल C++-शैली की स्ट्रिंग को स्ट्रिंग view में बदल सकता है, बल्कि C-शैली की स्ट्रिंग को भी। निम्नलिखित उदाहरण std::string_view के सरल उपयोग को दर्शाता है:

#include <iostream>
#include <string>
#include <string_view>

void printString(std::string_view str) {
  std::cout << str << std::endl;
}

int main() {
  std::string_view strv{"strv"}; // C++ string_view
  printString(strv);

  std::string str{"str"}; // C++ string
  printString(str);

  char cstr[] = "cstr"; // C-style string
  printString(cstr);

  return 0;
}

आउटपुट:

strv
str
cstr

इस उदाहरण में printString फंक्शन std::string_view को पैरामीटर के रूप में लेता है, जिससे यह फंक्शन अत्यंत हल्का और लचीला बन जाता है, क्योंकि किसी स्ट्रिंग की कोई प्रतिलिपि नहीं बनाई जाती; इस फंक्शन का उपयोग C तथा C++ शैली की स्ट्रिंग्स पास करके विभिन्न तरीकों से किया जा सकता है।

C++20

C++20 में कुछ नए उपयोगी मेंबर फंक्शन्स पेश किए गए, जिनमें starts_with(…) और ends_with(…) शामिल हैं। नाम के अनुसार, ये फंक्शन निर्धारित करते हैं कि कोई स्ट्रिंग (या स्ट्रिंग view) किसी कैरेक्टर या किसी std::string_view से शुरू/समाप्त होती है या नहीं। एक सरल उदाहरण:

#include <cassert>
#include <string>
#include <string_view>

int main() {
  const std::string str{"Hello World!"};

  assert(str.starts_with('H'));
  assert(str.ends_with('!'));

  assert(str.starts_with("Hello")); // 隐式转换为std::string_view
  assert(str.ends_with("World!")); // 隐式转换为std::string_view

  return 0;
}

C++23

C++23 में contains पेश किया गया, जो जाँचने के लिए है कि स्ट्रिंग में निर्दिष्ट सबस्ट्रिंग शामिल है या नहीं।

// 这是一个假设的C++23示例,实际上并不可用
#include <iostream>
#include <string>

int main() {
    std::string str = "C++23 introduces contains function.";

    if (str.contains("introduces")) {
        std::cout << "The string contains 'introduces'." << std::endl;
    } else {
        std::cout << "The string does not contain 'introduces'." << std::endl;
    }

    return 0;
}

https://en.cppreference.com/w/cpp/string/basic_string/contains

निष्कर्ष

नए C++ कोड में स्ट्रिंग्स से काम करते समय, कोड को यथासंभव लचीला और मेमोरी-कुशल बनाने पर विचार करना चाहिए। का उपयोग इन प्रयासों में बहुत सहायक हो सकता है। इसके अतिरिक्त, पढ़ने में आसान तथा लागू करने में सरल स्ट्रिंग पार्सिंग कोड के लिए starts_with और ends_with जैसे नवीनतम स्ट्रिंग मेंबर फंक्शन्स का उपयोग करने पर विचार करें। C++23 ने contains से गणना और भी सरल बना दी है — चीज़ें लगातार आधुनिक होती जा रही हैं।

संबंधित विषय

टिप्पणियाँ