अध्याय 13: C++ में टेम्पलेट्स (Templates in C++)

अध्याय 13: C++ में टेम्पलेट्स (Templates in C++)

C++ में टेम्पलेट्स एक शक्तिशाली फीचर हैं, जो आपको सामान्यीकृत प्रोग्रामिंग की सुविधा प्रदान करते हैं। टेम्पलेट्स का उपयोग करके आप फ़ंक्शन्स और क्लासेस को इस तरह से डिजाइन कर सकते हैं कि वे विभिन्न प्रकारों (types) के डेटा के साथ काम कर सकें, बिना कोड को बार-बार लिखने की आवश्यकता के। यह फीचर आपको कोड की पुन: प्रयोज्यता, लचीलापन, और कुशलता को बढ़ाने में मदद करता है। इस अध्याय में, हम समझेंगे कि C++ में टेम्पलेट्स क्या हैं, उनके प्रकार क्या हैं, और उनका उपयोग कैसे किया जाता है। हम फ़ंक्शन टेम्पलेट्स और क्लास टेम्पलेट्स के उदाहरणों के माध्यम से यह सीखेंगे कि कैसे टेम्पलेट्स आपको सामान्यीकृत प्रोग्रामिंग की ताकत प्रदान करते हैं। इस अध्याय के अंत तक, आप टेम्पलेट्स की अवधारणा को समझकर अपने प्रोग्राम्स को अधिक मॉड्यूलर, पुन: प्रयोज्य, और कुशल बनाने में सक्षम होंगे।

टेम्पलेट्स (Templates)

C++ में टेम्पलेट्स एक शक्तिशाली और महत्वपूर्ण फीचर हैं, जो सामान्यीकृत प्रोग्रामिंग की सुविधा प्रदान करते हैं। टेम्पलेट्स का उपयोग करके, आप फ़ंक्शन्स और क्लासेस को इस तरह से डिजाइन कर सकते हैं कि वे विभिन्न प्रकारों (types) के डेटा के साथ काम कर सकें, बिना कोड को बार-बार लिखने की आवश्यकता के। टेम्पलेट्स कोड की पुन: प्रयोज्यता, लचीलापन, और कुशलता को बढ़ाने में मदद करते हैं, खासकर जब आपको एक ही प्रकार के ऑपरेशन्स को विभिन्न डेटा टाइप्स के साथ निष्पादित करना हो।

1. फ़ंक्शन टेम्पलेट्स (Function Templates)

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

फ़ंक्शन टेम्पलेट का उदाहरण

#include <iostream>
using namespace std;

template <typename T>
T add(T a, T b) {
    return a + b;
}

int main() {
    cout << "Integer addition: " << add(3, 4) << endl;
    cout << "Double addition: " << add(3.5, 4.5) << endl;
    cout << "Float addition: " << add(2.5f, 3.5f) << endl;

    return 0;
}

इस उदाहरण में, add() फ़ंक्शन एक टेम्पलेट फ़ंक्शन है जो किसी भी प्रकार के डेटा (जैसे int, float, double) के लिए काम कर सकता है। टेम्पलेट में T एक प्लेसहोल्डर है, जो कि डेटा के वास्तविक प्रकार से बदल दिया जाता है जब फ़ंक्शन को कॉल किया जाता है।

2. क्लास टेम्पलेट्स (Class Templates)

क्लास टेम्पलेट्स आपको एक ही क्लास को विभिन्न प्रकारों के डेटा के साथ उपयोग करने की सुविधा देते हैं। यह विशेष रूप से उपयोगी होता है जब आप किसी डेटा स्ट्रक्चर (जैसे कि स्टैक, क्यू, लिस्ट) को विभिन्न प्रकारों के डेटा के लिए लागू करना चाहते हैं।

क्लास टेम्पलेट का उदाहरण

#include <iostream>
using namespace std;

template <typename T>
class Calculator {
public:
    T add(T a, T b) {
        return a + b;
    }

    T subtract(T a, T b) {
        return a - b;
    }
};

int main() {
    Calculator<int> intCalc;
    cout << "Integer addition: " << intCalc.add(5, 3) << endl;
    cout << "Integer subtraction: " << intCalc.subtract(5, 3) << endl;

    Calculator<double> doubleCalc;
    cout << "Double addition: " << doubleCalc.add(5.5, 3.3) << endl;
    cout << "Double subtraction: " << doubleCalc.subtract(5.5, 3.3) << endl;

    return 0;
}

इस उदाहरण में, Calculator एक टेम्पलेट क्लास है जो int, double, या किसी भी अन्य डेटा प्रकार के लिए काम कर सकता है। intCalc और doubleCalc क्रमशः int और double प्रकार के लिए Calculator क्लास के उदाहरण हैं।

3. टेम्पलेट्स के लाभ (Benefits of Templates)

  • कोड की पुन: प्रयोज्यता: टेम्पलेट्स का उपयोग करके आप एक ही कोड को विभिन्न प्रकारों के डेटा के लिए पुन: उपयोग कर सकते हैं, जिससे कोड की पुनरावृत्ति कम होती है।
  • लचीलापन: टेम्पलेट्स आपको कोड को अधिक लचीला बनाने की सुविधा देते हैं, क्योंकि एक ही टेम्पलेट को विभिन्न प्रकारों के साथ उपयोग किया जा सकता है।
  • कुशलता: टेम्पलेट्स के माध्यम से, आप जेनरिक प्रोग्रामिंग कर सकते हैं, जिससे कोड का विकास और रखरखाव अधिक कुशल हो जाता है।

4. टेम्पलेट्स का उपयोग करते समय ध्यान रखने योग्य बातें

  • सिंटैक्स: टेम्पलेट्स के साथ काम करते समय सही सिंटैक्स का पालन करना आवश्यक है। किसी भी प्रकार की त्रुटि से बचने के लिए टेम्पलेट की घोषणा और परिभाषा को ध्यान से समझें।
  • अधिभार (Overhead): हालांकि टेम्पलेट्स कोड की पुनरावृत्ति को कम करते हैं, उनका गलत उपयोग कोड के अधिभार (overhead) को बढ़ा सकता है।
  • कम्पाइल टाइम एरर: टेम्पलेट्स के साथ काम करते समय ज्यादातर एरर्स कम्पाइल टाइम पर उत्पन्न होते हैं, इसलिए उन्हें डिबग करना आसान हो सकता है, लेकिन उन्हें समझना कभी-कभी कठिन हो सकता है।

5. नॉन-टाइप टेम्पलेट पैरामीटर्स (Non-type Template Parameters)

टेम्पलेट्स में, आप डेटा प्रकार के बजाय नॉन-टाइप पैरामीटर्स का भी उपयोग कर सकते हैं, जैसे कि इंटीजर, बूलियन, या पॉइंटर। इसका उपयोग डेटा के आकार या अन्य स्थिर मानों को टेम्पलेट में निर्दिष्ट करने के लिए किया जा सकता है।

उदाहरण: नॉन-टाइप टेम्पलेट पैरामीटर

#include <iostream>
using namespace std;

template <typename T, int size>
class Array {
private:
    T arr[size];

public:
    void setElement(int index, T value) {
        if (index >= 0 && index < size) {
            arr[index] = value;
        }
    }

    T getElement(int index) {
        if (index >= 0 && index < size) {
            return arr[index];
        }
        return -1;  // Default return value
    }

    int getSize() {
        return size;
    }
};

int main() {
    Array<int, 5> intArray;

    intArray.setElement(0, 100);
    intArray.setElement(1, 200);

    cout << "Element at index 0: " << intArray.getElement(0) << endl;
    cout << "Array size: " << intArray.getSize() << endl;

    return 0;
}

इस उदाहरण में, Array क्लास टेम्पलेट में एक नॉन-टाइप पैरामीटर size का उपयोग किया गया है, जो कि एर्रे के आकार को परिभाषित करता है।

स्टैंडर्ड टेम्पलेट लाइब्रेरी (Standard Template Library)

स्टैंडर्ड टेम्पलेट लाइब्रेरी (STL) C++ की एक शक्तिशाली और महत्वपूर्ण लाइब्रेरी है, जो डेटा स्ट्रक्चर्स और एल्गोरिदम का एक संग्रह प्रदान करती है। STL का मुख्य उद्देश्य सामान्य डेटा संरचनाओं और एल्गोरिदम को कुशलतापूर्वक लागू करना और उपयोग करना है, जिससे कोड की पुन: प्रयोज्यता, लचीलापन, और विकास की गति को बढ़ाया जा सके। STL को तीन मुख्य घटकों में विभाजित किया गया है: कंटेनर्स (Containers), एल्गोरिदम (Algorithms), और इटेरेटर्स (Iterators)

1. कंटेनर्स (Containers)

कंटेनर्स STL का वह घटक है, जो डेटा को संग्रहीत और व्यवस्थित करने के लिए विभिन्न प्रकार की डेटा संरचनाएँ प्रदान करता है। कंटेनर्स डेटा को इस तरह से संरचित करते हैं कि इसे कुशलतापूर्वक एक्सेस और प्रबंधित किया जा सके। STL में कंटेनर्स को मुख्यतः तीन प्रकारों में विभाजित किया गया है: Sequence Containers, Associative Containers, और Unordered Containers

a. Sequence Containers:

Vector: एक डायनेमिक एर्रे होता है, जो आवश्यकतानुसार बढ़ता या घटता है। इसमें लगातार मेमोरी लोकेशन में डेटा संग्रहीत होता है।

#include <iostream>
#include <vector>
using namespace std;

int main() {
    vector<int> vec = {1, 2, 3, 4, 5};
    vec.push_back(6);

    for (int i : vec) {
        cout << i << " ";
    }

    return 0;
}

List: एक डबल-लिंक्ड लिस्ट होती है, जिसमें तत्वों को दोनों दिशाओं में नेविगेट किया जा सकता है। इसमें इनसर्शन और डिलीशन तेज होती है।
cpp
Copy code

#include <iostream>
#include <list>
using namespace std;

int main() {
    list<int> mylist = {1, 2, 3, 4, 5};
    mylist.push_back(6);

    for (int i : mylist) {
        cout << i << " ";
    }

    return 0;
}

Deque: एक डबल-एंडेड क्यू होती है, जिसमें आप दोनों सिरों से इनसर्शन और डिलीशन कर सकते हैं।
cpp
Copy code

#include <iostream>
#include <deque>
using namespace std;

int main() {
    deque<int> deq = {1, 2, 3, 4, 5};
    deq.push_front(0);

    for (int i : deq) {
        cout << i << " ";
    }

    return 0;
}

b. Associative Containers:

Set: एक कंटेनर है जो यूनिक एलिमेंट्स को स्टोर करता है और उन्हें ऑर्डर में रखता है। इसमें डुप्लिकेट एलिमेंट्स नहीं होते।

#include <iostream>
#include <set>
using namespace std;

int main() {
    set<int> myset = {1, 2, 3, 4, 5};
    myset.insert(6);

    for (int i : myset) {
        cout << i << " ";
    }

    return 0;
}

Map: एक कंटेनर है जो की-वैल्यू जोड़ी को स्टोर करता है, जहाँ प्रत्येक की यूनिक होती है और वैल्यू की से संबंधित होती है।

#include <iostream>
#include <map>
using namespace std;

int main() {
    map<int, string> mymap;
    mymap[1] = "One";
    mymap[2] = "Two";

    for (const auto &pair : mymap) {
        cout << pair.first << " : " << pair.second << endl;
    }

    return 0;
}

c. Unordered Containers:

  • Unordered Set: एक कंटेनर है जो यूनिक एलिमेंट्स को बिना किसी विशेष ऑर्डर में स्टोर करता है।
  • Unordered Map: एक कंटेनर है जो की-वैल्यू जोड़ी को बिना किसी विशेष ऑर्डर में स्टोर करता है।

2. एल्गोरिदम (Algorithms)

STL में एल्गोरिदम डेटा को प्रोसेस करने और उस पर ऑपरेशन करने के लिए उपयोगी फंक्शन्स का एक संग्रह है। ये एल्गोरिदम इटेरेटर्स के माध्यम से कंटेनर्स पर काम करते हैं और इसमें सॉर्टिंग, सर्चिंग, मर्जिंग, फिल्टरिंग, और अन्य ऑपरेशन्स शामिल हैं।

उदाहरण: एल्गोरिदम का उपयोग

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main() {
    vector<int> vec = {4, 2, 5, 1, 3};

    // सॉर्टिंग
    sort(vec.begin(), vec.end());

    // सर्चिंग
    if (binary_search(vec.begin(), vec.end(), 3)) {
        cout << "3 found in the vector." << endl;
    }

    return 0;
}

इस उदाहरण में, sort और binary_search एल्गोरिदम का उपयोग किया गया है, जो कि STL का हिस्सा हैं।

3. इटेरेटर्स (Iterators)

इटेरेटर्स पॉइंटर्स जैसे ऑब्जेक्ट्स होते हैं, जो कंटेनर्स के एलिमेंट्स पर नेविगेट करने और उन्हें एक्सेस करने की सुविधा देते हैं। इटेरेटर्स का उपयोग कंटेनर्स के साथ एल्गोरिदम को लागू करने के लिए किया जाता है। C++ में, इटेरेटर्स को पॉइंटर्स की तरह इस्तेमाल किया जा सकता है, जो कि कंटेनर्स के एलिमेंट्स के बीच नेविगेट करते हैं।

उदाहरण: इटेरेटर्स का उपयोग

#include <iostream>
#include <vector>
using namespace std;

int main() {
    vector<int> vec = {10, 20, 30, 40, 50};
    vector<int>::iterator it;

    for (it = vec.begin(); it != vec.end(); ++it) {
        cout << *it << " ";
    }

    return 0;
}

इस उदाहरण में, it एक इटेरेटर है जो vector के एलिमेंट्स पर नेविगेट कर रहा है और उन्हें एक्सेस कर रहा है।

STL के लाभ (Benefits of STL)

  • कोड की पुन: प्रयोज्यता: STL के कंटेनर्स और एल्गोरिदम कोड की पुन: प्रयोज्यता को बढ़ाते हैं, क्योंकि ये विभिन्न प्रकारों के डेटा के लिए सामान्यीकृत हैं।
  • कुशलता: STL के एल्गोरिदम और कंटेनर्स को इस प्रकार डिजाइन किया गया है कि वे उच्च प्रदर्शन और कुशल मेमोरी उपयोग प्रदान करते हैं।
  • लचीलापन: STL का उपयोग करके आप डेटा को कई प्रकार के कंटेनर्स में स्टोर कर सकते हैं और उन पर ऑपरेशन कर सकते हैं।
  • मानकीकरण: STL के माध्यम से आप कोड को अधिक मानकीकृत और पोर्टेबल बना सकते हैं, जिससे विभिन्न प्रोजेक्ट्स पर काम करना आसान हो जाता है।


Index