C++ उदाहरण के साथ सारणी का गतिशील आवंटन
डायनामिक ऐरे क्या है?
डायनेमिक ऐरे एक नियमित ऐरे के समान ही होता है, लेकिन प्रोग्राम रनटाइम के दौरान इसका आकार बदला जा सकता है। DynamArray तत्व मेमोरी के एक निरंतर ब्लॉक पर कब्जा करते हैं।
एक बार सरणी बन जाने के बाद, इसका आकार नहीं बदला जा सकता। हालाँकि, डायनेमिक सरणी अलग है। डायनेमिक सरणी भर जाने के बाद भी अपना आकार बढ़ा सकती है।
किसी सरणी के निर्माण के दौरान, उसे मेमोरी की एक पूर्व निर्धारित मात्रा आवंटित की जाती है। डायनेमिक सरणी के मामले में ऐसा नहीं है क्योंकि ज़रूरत पड़ने पर यह अपनी मेमोरी का आकार एक निश्चित कारक से बढ़ा लेती है।
डायनेमिक एरे के प्रदर्शन को प्रभावित करने वाले कारक
सरणी का आरंभिक आकार और उसका विकास कारक उसके प्रदर्शन को निर्धारित करते हैं। निम्नलिखित बिंदुओं पर ध्यान दें:
- यदि किसी सरणी का आकार छोटा है और उसका विकास कारक भी छोटा है, तो वह बार-बार मेमोरी पुनः आवंटित करती रहेगी। इससे सरणी का प्रदर्शन कम हो जाएगा।
- अगर किसी सरणी का आकार बड़ा है और उसका ग्रोथ फैक्टर भी बड़ा है, तो उसमें अप्रयुक्त मेमोरी का एक बड़ा हिस्सा होगा। इसके कारण, आकार बदलने के ऑपरेशन में ज़्यादा समय लग सकता है। इससे सरणी का प्रदर्शन कम हो जाएगा।
नया कीवर्ड
In C++, हम new कीवर्ड का उपयोग करके एक डायनामिक ऐरे बना सकते हैं। आवंटित किए जाने वाले आइटम की संख्या वर्गाकार कोष्ठकों की एक जोड़ी के भीतर निर्दिष्ट की जाती है। प्रकार का नाम इसके पहले होना चाहिए। अनुरोधित आइटम की संख्या आवंटित की जाएगी।
वाक्य - विन्यास
नया कीवर्ड निम्नलिखित सिंटैक्स लेता है:
pointer_variable = new data_type;
पॉइंटर_वैरिएबल का नाम है सूचक चर.
डेटा_टाइप मान्य होना चाहिए C++ डेटा प्रकार।
फिर कीवर्ड पहले आइटम के लिए एक पॉइंटर लौटाता है। डायनेमिक ऐरे बनाने के बाद, हम इसे डिलीट कीवर्ड का उपयोग करके हटा सकते हैं।
उदाहरण 1:
#include<iostream> using namespace std; int main() { int x, n; cout << "Enter the number of items:" << "\n"; cin >>n; int *arr = new int[n]; cout << "Enter " << n << " items" << endl; for (x = 0; x < n; x++) { cin >> arr[x]; } cout << "You entered: "; for (x = 0; x < n; x++) { cout << arr[x] << " "; } return 0; }
आउटपुट:
कोड का स्क्रीनशॉट यहां दिया गया है:
कोड स्पष्टीकरण:
- अपने प्रोग्राम में iostream हेडर फ़ाइल को शामिल करें ताकि इसका उपयोग किया जा सके कार्यों.
- हमारे प्रोग्राम में std नामस्थान को शामिल करें ताकि हम इसे कॉल किए बिना इसके क्लासों का उपयोग कर सकें।
- main() फ़ंक्शन को कॉल करें। प्रोग्राम लॉजिक को फ़ंक्शन के मुख्य भाग में जोड़ा जाना चाहिए।
- दो पूर्णांक चर x और n घोषित करें।
- कंसोल पर कुछ पाठ प्रिंट करें जो उपयोगकर्ता को चर n का मान दर्ज करने के लिए प्रेरित करे।
- कीबोर्ड से उपयोगकर्ता इनपुट पढ़ें और इसे वेरिएबल n को असाइन करें।
- कुल n पूर्णांकों को रखने के लिए एक सारणी घोषित करें और इसे पॉइंटर चर *arr को असाइन करें।
- उपयोगकर्ता को n संख्या में आइटम दर्ज करने के लिए प्रेरित करने वाला संदेश प्रिंट करें।
- उपयोगकर्ता द्वारा दर्ज किए गए आइटमों पर पुनरावृत्ति करने के लिए लूप वेरिएबल x बनाने के लिए for लूप का उपयोग करें।
- उपयोगकर्ता द्वारा दर्ज किए गए तत्वों को पढ़ें और उन्हें सरणी arr में संग्रहीत करें।
- शरीर का अंत पाश के लिए.
- कंसोल पर कुछ पाठ प्रिंट करें.
- सरणी के आइटमों पर पुनरावृत्ति करने के लिए लूप चर x बनाने के लिए for लूप का उपयोग करें।
- कंसोल पर arr नामक सरणी में निहित मानों को प्रिंट करें।
- फॉर लूप के मुख्य भाग का अंत.
- प्रोग्राम को सफलतापूर्वक पूरा होने पर मान लौटाना होगा।
- main() फ़ंक्शन के मुख्य भाग का अंत.
नोट: उपरोक्त उदाहरण में, उपयोगकर्ता को रन टाइम के दौरान सरणी के लिए कोई भी आकार निर्दिष्ट करने की अनुमति है। इसका मतलब है कि सरणी का आकार रनटाइम के दौरान निर्धारित किया जाता है.
गतिशील रूप से आवंटित सरणियाँ आरंभ करना
किसी गतिशील सारणी को 0 पर आरंभीकृत करना आसान है।
सिंटेक्स:
int *array{ new int[length]{} };
उपरोक्त सिंटैक्स में, लंबाई सरणी में जोड़े जाने वाले तत्वों की संख्या को दर्शाती है। चूँकि हमें सरणी को 0 पर आरंभीकृत करना है, इसलिए इसे खाली छोड़ देना चाहिए।
हम इनिशियलाइज़र सूची का उपयोग करके एक डायनामिक सरणी को इनिशियलाइज़ कर सकते हैं। आइए एक उदाहरण बनाते हैं जो इसे प्रदर्शित करता है।
उदाहरण 2:
#include <iostream> using namespace std; int main(void) { int x; int *array{ new int[5]{ 10, 7, 15, 3, 11 } }; cout << "Array elements: " << endl; for (x = 0; x < 5; x++) { cout << array[x] << endl; } return 0; }
आउटपुट:
कोड का स्क्रीनशॉट यहां दिया गया है:
कोड स्पष्टीकरण:
- इसके कार्यों का उपयोग करने के लिए iostream हेडर फ़ाइल को हमारे प्रोग्राम में शामिल करें।
- अपने प्रोग्राम में std नामस्थान को शामिल करें ताकि उसे कॉल किए बिना उसकी कक्षाओं का उपयोग किया जा सके।
- main() फ़ंक्शन को कॉल करें। प्रोग्राम लॉजिक को फ़ंक्शन के मुख्य भाग में जोड़ा जाना चाहिए।
- x नामक एक पूर्णांक चर घोषित करें.
- इनिशियलाइज़र सूची का उपयोग करके array नामक एक डायनामिक सरणी घोषित करें। सरणी में 5 पूर्णांक तत्व होंगे। ध्यान दें कि हमने सरणी लंबाई और इनिशियलाइज़र सूची के बीच “=" ऑपरेटर का उपयोग नहीं किया है।
- कंसोल पर कुछ टेक्स्ट प्रिंट करें। endl एक है C++ कीवर्ड जिसका मतलब है अंतिम पंक्ति। यह कर्सर को अगले वाक्य पर ले जाता है।
- सरणी तत्वों पर पुनरावृत्ति करने के लिए for loop का उपयोग करें।
- कंसोल पर array नामक सरणी की सामग्री को प्रिंट करें।
- फॉर लूप के मुख्य भाग का अंत.
- प्रोग्राम को सफलतापूर्वक पूरा होने पर मान लौटाना होगा।
- main() फ़ंक्शन के मुख्य भाग का अंत.
सारणियों का आकार बदलना
गतिशील सारणी की लंबाई आवंटन समय के दौरान निर्धारित की जाती है।
हालांकि, C++ एक बार सरणी आवंटित हो जाने के बाद उसका आकार बदलने की कोई अंतर्निहित प्रणाली नहीं होती।
हालाँकि, आप गतिशील रूप से एक नई सरणी आवंटित करके, तत्वों की प्रतिलिपि बनाकर, फिर पुरानी सरणी को मिटाकर इस चुनौती पर काबू पा सकते हैं।
ध्यान दें: इस तकनीक में त्रुटियाँ होने की संभावना है, इसलिए इससे बचने का प्रयास करें।
गतिशील रूप से सारणी हटाना
एक बार जब इसका उद्देश्य पूरा हो जाता है तो डायनेमिक ऐरे को कंप्यूटर मेमोरी से हटा दिया जाना चाहिए। डिलीट स्टेटमेंट आपको इसे पूरा करने में मदद कर सकता है। रिलीज़ की गई मेमोरी स्पेस का इस्तेमाल डेटा के दूसरे सेट को रखने के लिए किया जा सकता है। हालाँकि, भले ही आप डायनेमिक ऐरे को कंप्यूटर मेमोरी से न हटाएँ, लेकिन प्रोग्राम समाप्त होने पर यह अपने आप हट जाएगा।
टिप्पणी:
कंप्यूटर मेमोरी से डायनेमिक ऐरे को हटाने के लिए, आपको डिलीट के बजाय डिलीट[] का उपयोग करना चाहिए। [] CPU को एक वैरिएबल के बजाय कई वैरिएबल को हटाने का निर्देश देता है। डायनेमिक ऐरे से निपटने के दौरान डिलीट[] के बजाय डिलीट का उपयोग करने से समस्याएँ हो सकती हैं। ऐसी समस्याओं के उदाहरणों में मेमोरी लीक, डेटा करप्शन, क्रैश आदि शामिल हैं।
उदाहरण 3:
#include<iostream> using namespace std; int main() { int x, n; cout << "How many numbers will you type?" << "\n"; cin >>n; int *arr = new int[n]; cout << "Enter " << n << " numbers" << endl; for (x = 0; x < n; x++) { cin >> arr[x]; } cout << "You typed: "; for (x = 0; x < n; x++) { cout << arr[x] << " "; } cout << endl; delete [] arr; return 0; }
आउटपुट:
कोड का स्क्रीनशॉट यहां दिया गया है:
कोड स्पष्टीकरण:
- इसके कार्यों का उपयोग करने के लिए अपने प्रोग्राम में iostream हेडर फ़ाइल शामिल करें।
- हमारे प्रोग्राम में std नामस्थान को शामिल करें ताकि हम इसे कॉल किए बिना इसके क्लासों का उपयोग कर सकें।
- main() फ़ंक्शन को कॉल करें। प्रोग्राम लॉजिक को फ़ंक्शन के मुख्य भाग में जोड़ा जाना चाहिए।
- पूर्णांक डेटा प्रकार के दो चर x और n घोषित करें।
- कंसोल पर कुछ टेक्स्ट प्रिंट करें। टेक्स्ट में उपयोगकर्ता से पूछा जाएगा कि वे कितने नंबर दर्ज करेंगे।
- कीबोर्ड से उपयोगकर्ता इनपुट पढ़ें। इनपुट मान को वेरिएबल n को असाइन किया जाएगा।
- पॉइंटर वैरिएबल *arr घोषित करें। सरणी arr कुल n पूर्णांकों को संग्रहीत करने के लिए कुछ मेमोरी आरक्षित करेगी।
- कंसोल पर एक संदेश प्रिंट करें जिसमें उपयोगकर्ता को n संख्याएं दर्ज करने के लिए कहा जाए।
- उपयोगकर्ता द्वारा दर्ज की गई संख्याओं पर पुनरावृत्ति करने के लिए एक फॉर लूप और लूप वेरिएबल x बनाएं।
- उपयोगकर्ता द्वारा दर्ज की गई संख्याओं को पढ़ें और उन्हें सरणी arr में संग्रहीत करें।
- फॉर लूप के मुख्य भाग का अंत.
- कंसोल पर कुछ पाठ प्रिंट करें.
- सरणी arr की सामग्री पर पुनरावृत्ति करने के लिए for लूप और लूप वेरिएबल x का उपयोग करें।
- कंसोल पर सरणी arr के मानों को प्रिंट करें।
- फॉर लूप के मुख्य भाग का अंत.
- कंसोल पर एक खाली लाइन प्रिंट करें.
- सरणी arr की मेमोरी खाली करें.
- जब प्रोग्राम सफलतापूर्वक पूरा हो जाएगा तो वह मान लौटा देगा।
- main() फ़ंक्शन के मुख्य भाग का अंत.
सारांश
- नियमित सरणियों का एक निश्चित आकार होता है। एक बार घोषित होने के बाद आप उनके आकार को संशोधित नहीं कर सकते।
- इस प्रकार की सरणियों में मेमोरी का आकार संकलन समय के दौरान निर्धारित किया जाता है।
- डायनेमिक ऐरे अलग-अलग होते हैं। रनटाइम के दौरान उनके आकार बदले जा सकते हैं।
- गतिशील सरणियों में, आकार रनटाइम के दौरान निर्धारित किया जाता है।
- गतिशील सरणियाँ C++ new कीवर्ड का उपयोग करके घोषित किए जाते हैं।
- हम गतिशील सारणी में संग्रहित की जाने वाली वस्तुओं की संख्या निर्दिष्ट करने के लिए वर्गाकार कोष्ठकों का उपयोग करते हैं।
- एक बार ऐरे के साथ काम पूरा हो जाने पर, हम डिलीट ऑपरेटर का उपयोग करके मेमोरी को खाली कर सकते हैं।
- सभी ऐरे तत्वों की मेमोरी को मुक्त करने के लिए [] के साथ डिलीट ऑपरेटर का उपयोग करें।
- [] के बिना डिलीट करने पर केवल एक ही तत्व की मेमोरी मुक्त होती है।
- आकार बदलने के लिए कोई अंतर्निहित तंत्र नहीं है C++ सरणियों।
- सूची आरंभक का उपयोग करके किसी सारणी को आरंभ करने के लिए, हम “=" ऑपरेटर का उपयोग नहीं करते हैं।