पूर्णांक की एक गतिशील सरणी कैसे बनाएं


84

newकीवर्ड का उपयोग करके C ++ में पूर्णांक का डायनामिक ऐरे कैसे बनाएं ?


11
आप एक का उपयोग std::vector<int>। और एक किताब
GManNickG

एक बार आरंभ होने के बाद आप इसका डेटा कैसे असाइन और एक्सेस करेंगे?

इस पोस्ट पर एक नज़र डालें, यहाँ यह हर तरह के
डेटाटिप्स के


quora.com/What-is-the-meaning-of-%E2%80%9Cint- * p-new-10-% E2% 80% 9D #: ~: text =% 20statement% 20deines% 20and% 20initializes, ।% 20an% 20array% 20of% 20integers और पाठ = के इस% 20statement% 20will% 20dynamically% 20allocate, पूर्णांकों% 20from% 20the% 20heap ...
नागप्पा

जवाबों:


127
int main()
{
  int size;

  std::cin >> size;

  int *array = new int[size];

  delete [] array;

  return 0;
}

deleteआपके द्वारा आवंटित हर ऐरे को मत भूलना new


27
मैं -1 नहीं होगा, लेकिन अगर आप संभवतः भूल भी सकते हैं delete, तो आपका कोड गलत है।
GManNickG

2
8 साल बाद वह टिप्पणी शुरुआती उलझन में पड़ सकती है @GManNickG, इसे हटाने के बारे में कैसे (क्योंकि मुझे लगता है कि यह जेसन इवरसन द्वारा वास्तव में सरणी को हटाने से पहले बनाया गया था)?
gsamaras

2
@gsamaras: मैं मानता हूँ कि यह भ्रामक है, लेकिन यह अभी भी सही है: आपके कोड में मैन्युअल विलोपन नहीं होना चाहिए जिसे आपको याद रखना है न भूलना। यही है, स्मार्ट पॉइंटर्स और अन्य कंटेनरों का उपयोग किया जाता है।
GMNNICKG

@GManNickG मुझे लगता है कि आपकी टिप्पणी कम हठधर्मी हो सकती है। कोड सही है, भले ही वह आदर्श न हो। स्मार्ट पॉइंटर्स और कंटेनर लगभग हमेशा एक बेहतर विकल्प होते हैं (विशेषकर इस तरह के शुरुआती प्रश्न में) लेकिन हमेशा "हमेशा" नहीं।
स्पेंसर

64

C ++ 11 के बाद से, वहाँ एक सुरक्षित विकल्प है new[]और delete[]जो इसके विपरीत शून्य-ओवरहेड है std::vector:

std::unique_ptr<int[]> array(new int[size]);

C ++ 14 में:

auto array = std::make_unique<int[]>(size);

उपरोक्त दोनों एक ही हेडर फ़ाइल पर निर्भर करते हैं, #include <memory>


मुझे नहीं पता कि यह सिर्फ मेरे लिए है, लेकिन C ++ 11 सिंटैक्स भगवान को भयानक लगता है। C ++ 14 बेहतर तरीके से दिखता है। फिर से मैं पूर्व C ++ 11 के बाद से नहीं रखा है। इन सभी नई अभिव्यक्ति को याद रखना कठिन है।
कीरा करस्टिंग 20

29

आप मानक टेम्पलेट लाइब्रेरी का उपयोग करने पर विचार कर सकते हैं। यह सरल और उपयोग करने में आसान है, साथ ही आपको मेमोरी आवंटन के बारे में चिंता करने की आवश्यकता नहीं है।

http://www.cplusplus.com/reference/stl/vector/vector/

int size = 5;                    // declare the size of the vector
vector<int> myvector(size, 0);   // create a vector to hold "size" int's
                                 // all initialized to zero
myvector[0] = 1234;              // assign values like a c++ array

18
ठीक है, लेकिन वास्तविक प्रश्न का उत्तर देना अच्छा है।
एड एस।

8
@ ईडी, सवाल में प्रतिबंध बल्कि मनमाना लगता है। std::vectorउपयुक्त निर्माणकर्ता वास्तव में अच्छी तरह से काम करता है और इसे एक विकल्प के रूप में इंगित किया जाना चाहिए। कभी-कभी लोग प्रश्न को खराब तरीके से पूछते हैं, और यह उन मामलों में से एक के रूप में गिना जा सकता है - यह बहुत संक्षिप्त है और पसंद करने के लिए कोई तर्क नहीं देता है new
मार्क रैनसम

3
@ ईडी: new[]इसके बजाय उपयोग करने का कोई कारण नहीं है std::vector
GMANNICKG

2
@ बश: सी ++ में, कभी कोई कारण नहीं है। यदि आप किसी भी कारण से, "मानक पुस्तकालय को हटाने" का निर्णय लेते हैं, तो आप C ++ में अब प्रोग्रामिंग नहीं कर रहे हैं। मेरी टिप्पणी C ++ भाषा के लिए है, C ++ - भाषा-हम-उपयोग-पर-मेरा उपकरण नहीं है। फिर भी, आपको deleteकभी भी, किसी भी चीज़ की आवश्यकता नहीं होनी चाहिए । इसके अलावा, std::vectorएक गतिशील सरणी है, और लिंक की गई सूची के साथ कुछ भी नहीं करता है। यह स्मृति का एक हिस्सा है।
GManNickG

1
@Montdidier: नहीं। आप अभी भी उपयोग करते हैं newऔर deleteरैपर लागू करते हैं। मुद्दा यह है कि आप एक संसाधन का प्रबंधन नहीं करते हैं और इसका उपयोग करते हैं, आप एक या दूसरे को करते हैं।
GMANNICKG

6
int* array = new int[size];

2
यह सिर्फ सवाल का जवाब देता है।
एड एस।

@GManNickG क्योंकि वेक्टर अधिक सुविधाजनक हो सकता है या अन्य कारणों से? क्योंकि मैं अक्सर 3 पार्टी फ़ंक्शन का सामना करता हूं, जिसमें वैक्टर के बजाय सरणियों के उपयोग की आवश्यकता होती है।
लेजे मेजेस्टे

5
@ Lèsemajesté वैक्टर का उपयोग नहीं करने का कोई कारण नहीं है - std::vector::data()जब आवश्यक हो तो सदस्य फ़ंक्शन अंतर्निहित कच्चे सरणी को वापस कर देगा।
ईमली

3
@ मेग्निथ: आमतौर पर, आप वेक्टर से पॉइंटर प्राप्त करने के operator&बजाय उपयोग करेंगे data(), लेकिन यह सच है कि एक वेक्टर एरेज़ की गारंटी देता है जो एरे की अपेक्षा कार्यों के साथ संगतता के लिए आवश्यक है।
बेन वोइगट

3

जैसे ही प्रश्न डायनेमिक एरे के बारे में होता है, आप न केवल वेरिएबल साइज के साथ एरे बनाना चाहते हैं, बल्कि रनटाइम के दौरान इसका आकार बदलना भी चाहते हैं। यहाँ एक उदाहरण है memcpy, आप उपयोग कर सकते हैं memcpy_sया std::copyसाथ ही। संकलक के आधार पर, <memory.h>या <string.h>आवश्यकता हो सकती है। इस फ़ंक्शन का उपयोग करते समय आप नए मेमोरी क्षेत्र आवंटित करते हैं, मूल मेमोरी क्षेत्रों के मूल्यों को कॉपी करें और फिर उन्हें जारी करें।

//    create desired array dynamically
size_t length;
length = 100; //for example
int *array = new int[length];

//   now let's change is's size - e.g. add 50 new elements
size_t added = 50;
int *added_array = new int[added];

/*   
somehow set values to given arrays
*/ 

//    add elements to array
int* temp = new int[length + added];
memcpy(temp, array, length * sizeof(int));
memcpy(temp + length, added_array, added * sizeof(int));
delete[] array;
array = temp;

आप इसके बजाय निरंतर 4 का उपयोग कर सकते हैं sizeof(int)


1

गतिशील रूप से कुछ मेमोरी आवंटित करें new:

int* array = new int[SIZE];

2
आप शायद बृहदान्त्र को याद कर रहे हैं, या साइज़ को वास्तविक आकार से नहीं बदला है ।
मोनाटिडियर

5
अर्ध-उपनिवेश क्यों होना चाहिए? यह एक पूर्ण कथन नहीं है। और भी घोषणाएं हो सकती हैं। यह, यदि एक पूर्ण कार्यक्रम में शामिल है, तो वही करता है जो ओपी ने पूछा था।
बेंजामिन लिंडले

0
#include <stdio.h>
#include <cstring>
#include <iostream>

using namespace std;

int main()
{

    float arr[2095879];
    long k,i;
    char ch[100];
    k=0;

    do{
        cin>>ch;
        arr[k]=atof(ch);
        k++;
     }while(ch[0]=='0');

    cout<<"Array output"<<endl;
    for(i=0;i<k;i++){
        cout<<arr[i]<<endl;
    }

    return 0;
}

उपरोक्त कोड काम करता है, अधिकतम फ्लोट या इंट सरणी आकार जिसे परिभाषित किया जा सकता है, आकार 2095879 के साथ था, और बाहर निकलने की स्थिति गैर शून्य शुरुआत इनपुट संख्या होगी

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.