Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> C++

C++ में std::vector::resize() और std::vector::reserve() का अंतर

वेक्टर में डायनामिक ऐरे की तरह खुद को ऑटोमैटिकली रीसाइज़ करने की क्षमता होती है। जब कोई एलिमेंट डाला या हटाया जाता है, तो कंटेनर अपने स्टोरेज को ऑटोमैटिकली संभालता है।

vector::resize() और vector::reserve() के बीच मुख्य अंतर यह है कि resize() वेक्टर का साइज़ बदलने के लिए उपयोग किया जाता है जबकि reserve() नहीं करता। reserve() का उपयोग केवल निर्दिष्ट संख्या में एलिमेंट्स को बिना मेमोरी रीअलोकेट किए स्टोर करने के लिए किया जाता है। लेकिन resize() में यदि संख्या वर्तमान संख्या से छोटी है तो यह मेमोरी को रीसाइज़ करता है और उसके ऊपर का अतिरिक्त स्पेस डिलीट कर देता है।

vector::resize()

वेक्टर resize() का उपयोग इसके साइज़ को बदलने के लिए किया जाता है।

उदाहरण

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

int main() {
    vector<int> v;
    vector<int>::iterator it;
    int c, i;
    while (1) {
        cout << "1. वेक्टर का साइज़" << endl;
        cout << "2. वेक्टर में एलिमेंट डालें" << endl;
        cout << "3. वेक्टर को रीसाइज़ करें" << endl;
        cout << "4. इटरेटर द्वारा दिखाएं" << endl;
        cout << "5. बाहर निकलें" << endl;
        cout << "अपनी पसंद दर्ज करें: ";
        cin >> c;
        switch(c) {
            case 1:
                cout << "वेक्टर का साइज़: ";
                cout << v.size() << endl;
                break;
            case 2:
                cout << "डालने के लिए मान दर्ज करें: ";
                cin >> i;
                v.push_back(i);
                break;
            case 3:
                cout << "वेक्टर एलिमेंट्स रीसाइज़ करें:" << endl;
                v.resize(4);
                break;
            case 4:
                cout << "इटरेटर द्वारा वेक्टर दिखा रहे हैं: ";
                for (it = v.begin(); it != v.end(); it++)
                    cout << *it << " ";
                cout << endl;
                break;
            case 5:
                exit(1);
                break;
            default:
                cout << "गलत पसंद" << endl;
        }
    }
    return 0;
}

आउटपुट

1. वेक्टर का साइज़
2. वेक्टर में एलिमेंट डालें
3. वेक्टर को रीसाइज़ करें
4. इटरेटर द्वारा दिखाएं
5. बाहर निकलें
अपनी पसंद दर्ज करें: 1
वेक्टर का साइज़: 0
...
अपनी पसंद दर्ज करें: 3
वेक्टर एलिमेंट्स रीसाइज़ करें:
अपनी पसंद दर्ज करें: 4
इटरेटर द्वारा वेक्टर दिखा रहे हैं: 1 2 4 5

vector::reserve()

Vector reserve() इंगित करता है कि वेक्टर इस तरह बनाया गया है कि यह बिना मेमोरी रीअलोकेट किए कम से कम निर्दिष्ट संख्या में एलिमेंट्स स्टोर कर सकता है।

एल्गोरिदम

शुरुआत
    वेक्टर टाइप का वेरिएबल v घोषित करें
    वेक्टर टाइप का इटरेटर it घोषित करें
    integer डेटाटाइप के दो वेरिएबल c और i घोषित करें
    while (1) करें
        "1. वेक्टर का साइज़" प्रिंट करें
        "2. वेक्टर में एलिमेंट डालें" प्रिंट करें
        "3. वेक्टर रिज़र्व करें" प्रिंट करें
        "4. इटरेटर द्वारा दिखाएं" प्रिंट करें
        "5. बाहर निकलें" प्रिंट करें
        "अपनी पसंद दर्ज करें:" प्रिंट करें
        वेरिएबल c का मान दर्ज करें
        Switch(c)
            Case 1:
                "वेक्टर का साइज़:" प्रिंट करें
                size() फ़ंक्शन कॉल करके वेक्टर का साइज़ प्रिंट करें
                Break
            Case 2:
                "डालने के लिए मान दर्ज करें:" प्रिंट करें
                वेरिएबल i का मान दर्ज करें
                push_back() फ़ंक्शन कॉल करके वेक्टर में मान डालें
                Break
            Case 3:
                "वेक्टर एलिमेंट्स रिज़र्व करें:" प्रिंट करें
                reserve() फ़ंक्शन कॉल करके वेक्टर का साइज़ रिज़र्व करें
                Break
            Case 4:
                "इटरेटर द्वारा वेक्टर दिखा रहे हैं:" प्रिंट करें
                for (it = v.begin(); it != v.end(); it++)
                    इटरेटर it का मान प्रिंट करें
                Break
            Case 5:
                exit() फ़ंक्शन कॉल करके बाहर निकलें
                break
            Default:
                "गलत पसंद" प्रिंट करें
समाप्ति

उदाहरण

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

int main() {
    vector<int> v;
    vector<int>::iterator it;
    int c, i;
    while (1) {
        cout << "1. वेक्टर का साइज़" << endl;
        cout << "2. वेक्टर में एलिमेंट डालें" << endl;
        cout << "3. वेक्टर रिज़र्व करें" << endl;
        cout << "4. इटरेटर द्वारा दिखाएं" << endl;
        cout << "5. बाहर निकलें" << endl;
        cout << "अपनी पसंद दर्ज करें: ";
        cin >> c;
        switch(c) {
            case 1:
                cout << "वेक्टर का साइज़: ";
                cout << v.size() << endl;
                break;
            case 2:
                cout << "डालने के लिए मान दर्ज करें: ";
                cin >> i;
                v.push_back(i);
                break;
            case 3:
                cout << "वेक्टर एलिमेंट्स रिज़र्व करें।" << endl;
                v.reserve(100);
                break;
            case 4:
                cout << "इटरेटर द्वारा वेक्टर दिखा रहे हैं: ";
                for (it = v.begin(); it != v.end(); it++) {
                    cout << *it << " ";
                }
                cout << endl;
                break;
            case 5:
                exit(1);
                break;
            default:
                cout << "गलत पसंद" << endl;
        }
    }
    return 0;
}

आउटपुट

1. वेक्टर का साइज़
2. वेक्टर में एलिमेंट डालें
3. वेक्टर रिज़र्व करें
4. इटरेटर द्वारा दिखाएं
5. बाहर निकलें
अपनी पसंद दर्ज करें: 1
वेक्टर का साइज़: 0
...
अपनी पसंद दर्ज करें: 3
वेक्टर एलिमेंट्स रिज़र्व करें।
अपनी पसंद दर्ज करें: 4
इटरेटर द्वारा वेक्टर दिखा रहे हैं: 1 2 3 4 5

मुख्य अंतर सारांश

पहलू resize(n) reserve(n)
साइज़ (size()) n हो जाता है अपरिवर्तित रहता है
क्षमता (capacity()) कम से कम n कम से कम n
नए एलिमेंट्स डिफ़ॉल्ट मान से भरे जाते हैं नहीं बनते
उपयोग वास्तविक एलिमेंट्स की संख्या बदलना प्रीअलोकेशन द्वारा परफॉर्मेंस सुधारना

नोट: यह आर्टिकल 1005082676 का डुप्लीकेट प्रतीत होता है। दोनों में समान सामग्री है।

  1. - C++ में std::vector को शफ़ल कैसे करें?

    वेक्टर को शफ़ल करने के लिए फिशर-येट्स शफ़ल एल्गोरिदम का उपयोग किया जाता है। इस एल्गोरिदम में, वेक्टर का एक लीनियर स्कैन किया जाता है और फिर प्रत्येक एलिमेंट को शेष सभी एलिमेंट्स (स्वयं सहित) में से एक रैंडम एलिमेंट के साथ स्वैप किया जाता है। एल्गोरिदम शुरुआत show() फ़ंक्शन घोषित करें show(

  1. - C++ में vector::resize() और vector::reserve() का अंतर

    वेक्टर में डायनामिक ऐरे की तरह खुद को ऑटोमैटिकली रीसाइज़ करने की क्षमता होती है। जब कोई एलिमेंट डाला या हटाया जाता है, तो कंटेनर अपने स्टोरेज को ऑटोमैटिकली संभालता है। vector::resize() और vector::reserve() के बीच मुख्य अंतर यह है कि resize() वेक्टर का साइज़ बदलने के लिए उपयोग किया जाता है जबकि rese

  1. - C++ में टाइप इन्फरेंस (प्रकार निगमन)

    टाइप इन्फरेंस या डिडक्शन का अर्थ है प्रोग्रामिंग भाषा में एक एक्सप्रेशन के डेटा टाइप का ऑटोमैटिक डिटेक्शन। यह कुछ स्ट्रॉन्गली स्टैटिकली टाइप्ड भाषाओं में मौजूद एक विशेषता है। C++ में, auto कीवर्ड (C++11 में जोड़ा गया) ऑटोमैटिक टाइप डिडक्शन के लिए उपयोग किया जाता है। उदाहरण के लिए, आप एक वेक्टर पर पु