पुनः उपयोग योग्य Vector प्रकार
आकार और क्षमता को लपेटें।
पुनः उपयोग योग्य Vector प्रकार, CoddyKit पर C Academy का एक निःशुल्क पाठ है। यह 4 में से 3वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह C Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। C Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
बिखरे हुए कोड से एक प्रकार तक
एक पॉइंटर, गिनती और क्षमता को तीन अलग-अलग चर के रूप में इधर-उधर भेजना त्रुटियों का कारण बन सकता है।
आइए इन्हें एक struct में जोड़ते हैं: एक पुनःप्रयोग योग्य गतिशील ऐरे, जिसे अक्सर वेक्टर कहा जाता है। यह डेटा और उससे संबंधित हिसाब-किताब को एक साथ रखता है।
वेक्टर स्ट्रक्चर
एक वेक्टर में तीन फ़ील्ड आवश्यक हैं: डेटा का पॉइंटर, उपयोग किए जा रहे तत्वों की संख्या (len), और आकार बदलने से पहले समा सकने वाले तत्वों की संख्या (cap)।
typedef struct {
int *data;
size_t len;
size_t cap;
} Vec;वेक्टर का प्रारंभीकरण
एक खाली वेक्टर में NULL डेटा पॉइंटर तथा शून्य लंबाई और क्षमता होती है। एक छोटा init फ़ंक्शन उद्देश्य को स्पष्ट करता है।
void vec_init(Vec *v) {
v->data = NULL;
v->len = 0;
v->cap = 0;
}पुश क्रिया
vec_push अंत में एक तत्व जोड़ता है। यदि वेक्टर भर गया हो, तो यह पहले क्षमता को दोगुना करता है।
सफलता पर यह 0 और आवंटन विफल होने पर -1 लौटाता है, ताकि कॉल करने वाला उसके अनुसार कार्य कर सके।
int vec_push(Vec *v, int value) {
if (v->len == v->cap) {
size_t nc = v->cap ? v->cap * 2 : 4;
int *tmp = realloc(v->data, nc * sizeof(*v->data));
if (!tmp) return -1;
v->data = tmp;
v->cap = nc;
}
v->data[v->len++] = value;
return 0;
}तत्वों को वापस पढ़ना
क्योंकि len उपयोग किए गए तत्वों की संख्या रखता है, इसलिए आप 0 से len - 1 तक पुनरावृत्ति करते हैं। क्षमता अधिक हो सकती है, लेकिन वे स्लॉट अभी आपके डेटा का हिस्सा नहीं हैं।
for (size_t i = 0; i < v->len; i++)
printf("%d\n", v->data[i]);वेक्टर की मेमोरी मुक्त करना
वेक्टर अपने हीप बफ़र का स्वामी होता है, इसलिए इसके लिए एक संगत सफ़ाई फ़ंक्शन आवश्यक है। मुक्त करने के बाद फ़ील्ड को फिर से प्रारंभिक मान दें, ताकि स्ट्रक्चर का गलत उपयोग न हो सके।
void vec_free(Vec *v) {
free(v->data);
v->data = NULL;
v->len = v->cap = 0;
}सब कुछ एक साथ
यह पूरा प्रोग्राम एक वेक्टर बनाता है, पाँच मान जोड़ता है, उन्हें प्रदर्शित करता है और फिर उसे सही ढंग से मुक्त करता है।
#include <stdio.h>
#include <stdlib.h>
typedef struct { int *data; size_t len, cap; } Vec;
int vec_push(Vec *v, int value) {
if (v->len == v->cap) {
size_t nc = v->cap ? v->cap * 2 : 4;
int *tmp = realloc(v->data, nc * sizeof(*v->data));
if (!tmp) return -1;
v->data = tmp; v->cap = nc;
}
v->data[v->len++] = value;
return 0;
}
int main(void) {
Vec v = {0};
for (int i = 0; i < 5; i++) vec_push(&v, i * 10);
for (size_t i = 0; i < v.len; i++) printf("%d\n", v.data[i]);
free(v.data);
return 0;
}{0} से शून्य-प्रारंभीकरण
Vec v = {0}; लिखने से डेटा पॉइंटर सहित हर फ़ील्ड का मान शून्य हो जाता है, और डेटा पॉइंटर NULL हो जाता है।
यह एक सुविधाजनक संक्षिप्त तरीका है, जिससे कोई स्पष्ट init फ़ंक्शन बुलाए बिना वेक्टर vec_push के लिए तैयार हो जाता है।
Vec v = {0}; /* data=NULL, len=0, cap=0 */
vec_push(&v, 42);एक सुरक्षित get सहायक
len से आगे इंडेक्स करना एक बग है। एक छोटा एक्सेसर सीमा की जाँच कर सकता है और त्रुटि का संकेत दे सकता है; इसके बदले थोड़ी गति कम होती है, लेकिन सुरक्षा बढ़ती है।
int vec_get(const Vec *v, size_t i, int *out) {
if (i >= v->len) return -1; /* out of range */
*out = v->data[i];
return 0;
}len और cap को अलग-अलग क्यों रखें
cap बताता है कि कितनी मेमोरी आवंटित है; len बताता है कि आप वास्तव में कितनी मेमोरी का उपयोग कर रहे हैं।
अतिरिक्त क्षमता रखने से अधिकांश पुश क्रियाओं में realloc को बुलाने की आवश्यकता नहीं पड़ती। यही अलगाव वेक्टर को तेज़ और लचीला बनाता है।
प्रकार को सामान्य बनाना
यह वेक्टर int संग्रहीत करता है। अन्य प्रकार रखने के लिए आप तत्व का प्रकार बदल सकते हैं, या तत्व के आकार के साथ void * संग्रहीत कर सकते हैं।
आप चाहे जो भी संग्रहीत करें, मूल ढाँचा—init, push और free—एक जैसा रहता है।
typedef struct {
double *data;
size_t len, cap;
} DVec; /* same shape, different element type */त्वरित जाँच
वेक्टर प्रकार की अपनी समझ जाँचें।
पुनरावलोकन
एक वेक्टर डेटा पॉइंटर, len और cap को एक ही struct में जोड़ता है।
vec_push वेक्टर भर जाने पर क्षमता को दोगुना करता है, vec_free बफ़र को मुक्त करके फ़ील्ड रीसेट करता है, और {0} सही ढंग से प्रारंभीकरण करता है। यह पुनःप्रयोग योग्य ढाँचा अलग-अलग चरों को संभालने से बेहतर है। अगला विषय है: सही ढंग से मुक्त करना और लीक से बचना।
एआई शिक्षक के साथ C सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 39
- पाठ
- 144
अक्सर पूछे जाने वाले प्रश्न
क्या “पुनः उपयोग योग्य Vector प्रकार” पाठ निःशुल्क है?
हाँ—“पुनः उपयोग योग्य Vector प्रकार” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और C Academy पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। C Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“पुनः उपयोग योग्य Vector प्रकार” में मैं क्या सीखूँगा?
आकार और क्षमता को लपेटें। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ C Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या C Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर C Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 3वाँ पाठ है।
“पुनः उपयोग योग्य Vector प्रकार” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस C Academy पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर C Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- Array के लिए मेमोरी आवंटित करना
- realloc से बढ़ाना
- पुनः उपयोग योग्य Vector प्रकार
- मेमोरी मुक्त करना और लीक से बचना